获取属性的名称作为一个字符串
获取属性的名称作为一个字符串
(参见下面我使用已接受答案创建的解决方案)
我正在努力改善涉及反射的一些代码的可维护性。该应用程序具有.NET Remoting接口,其中包含一个名为Execute
的方法,用于访问未包含在其发布的远程接口中的应用程序部分。
以下是应用程序指定要通过Execute访问的属性的方法(在此示例中为静态属性):
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
因此,远程用户可以调用:
string response = remoteObject.Execute("SomeSecret");
应用程序将使用反射查找SomeClass.SomeProperty并将其值作为字符串返回。
不幸的是,如果有人重命名SomeProperty并忘记更改ExposeProperty()的第三个参数,这个机制就会出错。
我需要等效于:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
用作ExposeProperty的第三个参数,这样重构工具就会处理重命名。
有办法做到这一点吗?
好吧,这是我最终创建的内容(基于我选择的答案和他引用的问题):
//// 从属性访问lambda中获取静态或实例属性的名称。 // //属性的类型 // 形式为:'() => Class.Property'或'() => object.Property'的lambda表达式 //属性的名称 public string GetPropertyName(Expression > propertyLambda) { var me = propertyLambda.Body as MemberExpression; if (me == null) { throw new ArgumentException("您必须传递形式为:'() => Class.Property'或'() => object.Property'的lambda表达式"); } return me.Member.Name; }
用法:
// 静态属性 string name = GetPropertyName(() => SomeClass.SomeProperty); // 实例属性 string name = GetPropertyName(() => someObject.SomeProperty);
现在有了这个很酷的功能,是时候简化ExposeProperty方法了。擦亮门把手是危险的工作...
问题出现的原因是需要从一个属性访问的lambda表达式中获取属性的名称。解决方法是创建一个泛型方法`GetPropertyName
在方法内部,首先将lambda表达式的`Body`属性转换为`MemberExpression`类型的变量`me`。然后,通过判断`me`是否为null来确定lambda表达式是否符合要求。如果`me`为null,则抛出异常。
最后,返回`me.Member.Name`,即属性的名称。
使用示例中,首先调用`GetPropertyName`方法传入一个静态属性访问的lambda表达式,将返回该属性的名称,并赋值给变量`name`。然后,再传入一个实例属性访问的lambda表达式,同样获得属性的名称,并赋值给变量`name`。
整体而言,这段代码通过泛型方法和lambda表达式的使用,实现了从属性访问的lambda表达式中获取属性名称的功能。
在C# 6.0中,出现了(Get name of property as a string)这个问题。该问题的原因是在编译时无法直接获取属性的名称作为字符串。然而,通过使用nameof表达式,可以在编译时将属性名解析为字符串形式,从而解决了这个问题。
使用nameof(SomeProperty)表达式,可以在编译时将属性"SomeProperty"解析为字符串形式。这个特性非常强大,对于ModelState.AddModelError调用非常有用。
然而,如果需要对属性名进行混淆(obfuscation),那么nameof就无法工作了。因为nameof是在编译时解析的,而混淆是在运行时应用的。相比之下,第一种方法使用表达式体成员名称可以与混淆一起工作,因为它是在运行时确定的。
总之,通过使用nameof表达式,我们可以在编译时将属性名解析为字符串形式,解决了获取属性名作为字符串的问题。但是在需要对属性名进行混淆的情况下,nameof就无法使用了,需要使用表达式体成员名称的方法来代替。
原因:
在这段代码中,作者想要通过lambda表达式获取属性的名称。他引用了一个GetMemberInfo的方法,但是无法找到包含这个方法的程序集或NuGet包。他在MSDN上找到了一个名为"common utilities"的Microsoft Enterprise Library,但是在这个库中并没有找到所需的方法。虽然有一个非官方的包含这个方法的库,但是作者并不满意。
解决方法:
作者提到了两种解决方法。首先,他提到了另一个回答中的方法,这个方法更简洁且不依赖于一个看起来不可用的库。另外,他还提到了可以使用Type.GetMembers方法来替代GetMemberInfo方法。
作者在这段代码中遇到了无法找到GetMemberInfo方法的问题。他提供了两种解决方法,分别是使用另一个回答中的方法或使用Type.GetMembers方法。