一尘不染

以字符串形式获取属性名称

c#

(请参见下面我使用接受的答案创建的解决方案)

我正在尝试改善某些涉及反射的代码的可维护性。该应用程序具有.NET
Remoting接口,该接口(除其他外)公开了一种称为Execute的方法,用于访问该应用程序发布的远程接口中未包括的部分。

这是应用程序指定通过Execute可以访问的属性(在此示例中为静态属性)的方式:

RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");

因此,远程用户可以致电:

string response = remoteObject.Execute("SomeSecret");

然后该应用将使用反射来查找SomeClass.SomeProperty并将其值作为字符串返回。

不幸的是,如果有人重命名SomeProperty而忘记更改ExposeProperty()的第三个参数,则会破坏此机制。

我需要相当于:

SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()

用作ExposeProperty中的第三个参数,因此重构工具将负责重命名。

有没有办法做到这一点?提前致谢。

好的,这就是我最终创建的内容(基于我选择的答案和他引用的问题):

// <summary>
// Get the name of a static or instance property from a property access lambda.
// </summary>
// <typeparam name="T">Type of the property</typeparam>
// <param name="propertyLambda">lambda expression of the form: '() => Class.Property' or '() => object.Property'</param>
// <returns>The name of the property</returns>
public string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
{
    var me = propertyLambda.Body as MemberExpression;

    if (me == null)
    {
        throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
    }

    return me.Member.Name;
 }

用法:

// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);

// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);

现在有了这种出色的功能,是时候简化ExposeProperty方法了。抛光门把手是危险的工作。

谢谢大家。


阅读 340

收藏
2020-05-19

共1个答案

一尘不染

从此处使用GetMemberInfo:从lambda表达式检索属性名称,您可以执行以下操作:

RemoteMgr.ExposeProperty(() => SomeClass.SomeProperty)

public class SomeClass
{
    public static string SomeProperty
    {
        get { return "Foo"; }
    }
}

public class RemoteMgr
{
    public static void ExposeProperty<T>(Expression<Func<T>> property)
    {
        var expression = GetMemberInfo(property);
        string path = string.Concat(expression.Member.DeclaringType.FullName,
            ".", expression.Member.Name);
        // Do ExposeProperty work here...
    }
}

public class Program
{
    public static void Main()
    {
        RemoteMgr.ExposeProperty("SomeSecret", () => SomeClass.SomeProperty);
    }
}
2020-05-19