如何使用nameof来获取长属性路径的 "fullnameof"?

问题描述 投票:0回答:1

我有以下语句。

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 来获取完整的路径。

c#
1个回答
0
投票

总是有 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);

0
投票

你可以使用表达式树来获取表达式成员的名称。

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".

© www.soinside.com 2019 - 2024. All rights reserved.