(请参阅下面我使用接受的答案创建的解决方案)
我正在尝试改善某些涉及反射的代码的可维护性。该应用程序具有.NET Remoting接口(interface),该接口(interface)(除其他外)公开了一种称为Execute
的方法,用于访问该应用程序未包含在其发布的远程接口(interface)中的部分。
这是应用程序指定通过Execute可以访问的属性(在此示例中为静态属性)的方式:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
因此,远程用户可以致电:string response = remoteObject.Execute("SomeSecret");
并且该应用将使用反射来查找SomeClass.SomeProperty并将其值作为字符串返回。不幸的是,如果有人重命名SomeProperty而忘记更改ExposeProperty()的第3个参数,则会破坏此机制。
我需要相当于:
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方法了。抛光门 Handlebars 是危险的工作。 最佳答案
从这里:Retrieving Property name from lambda expression使用GetMemberInfo,您可以执行以下操作: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);
}
}