我有以下语句。
queryPublications += $" AND CC_Publication__r.CC_External_ID__c IN ({inPublicationExtIds})";
现在我想用 名词 以获得编译时安全的名字,以防将来有什么变化。但是修改后的代码看起来并不好看。
queryPublications += $" AND {nameof(CC_Publication_Subscription__c.CC_Publication__r)}.{nameof(CC_Publication_Subscription__c.CC_Publication__r.CC_External_ID__c)} IN ({inPublicationExtIds})";
考虑到有更多的字段或者属性路径(正确的说法是什么?)变得更长了,代码变得非常丑陋,你很容易出错。
AND Class1.Prperty1.Class2.Property2.Class3.Property3 IN
代码变得非常丑陋,而且你很容易出错。你必须重复当前之前的整个部分。
有没有什么方法(扩展或技术)来简化我的方法?
如果能有一个 fullnameof
来获取完整的路径。
总是有 string.Format
- 你并不总是需要使用插值字符串。
queryPublications += string.Format(" AND {0}.{1} IN ({2})",
nameof(CC_Publication_Subscription__c.CC_Publication__r),
nameof(CC_Publication_Subscription__c.CC_Publication__r.CC_External_ID__c),
inPublicationExtIds);
你可以使用表达式树来获取表达式成员的名称。
public static string NameOf<T>(Expression<Func<T>> pathExpr)
{
var members = new Stack<string>();
for (var memberExpr = pathExpr.Body as MemberExpression; memberExpr != null; memberExpr = memberExpr.Expression as MemberExpression)
{
members.Push(memberExpr.Member.Name);
}
return string.Join(".", members);
}
如果你像这样调用它:
NameOf(() => CC_Publication_Subscription__c.CC_Publication__r.CC_External_ID__c)
它将返回 "CC_Publication_Subscription__c.CC_Publication__r.CC_External_ID__c"
.