获取属性的名称作为一个字符串

33 浏览
0 Comments

获取属性的名称作为一个字符串

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

我正在努力改善涉及反射的一些代码的可维护性。该应用程序具有.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方法了。擦亮门把手是危险的工作...

0
0 Comments

问题出现的原因是需要从一个属性访问的lambda表达式中获取属性的名称。解决方法是创建一个泛型方法`GetPropertyName`,该方法接受一个属性访问的lambda表达式作为参数,并返回属性的名称。

在方法内部,首先将lambda表达式的`Body`属性转换为`MemberExpression`类型的变量`me`。然后,通过判断`me`是否为null来确定lambda表达式是否符合要求。如果`me`为null,则抛出异常。

最后,返回`me.Member.Name`,即属性的名称。

使用示例中,首先调用`GetPropertyName`方法传入一个静态属性访问的lambda表达式,将返回该属性的名称,并赋值给变量`name`。然后,再传入一个实例属性访问的lambda表达式,同样获得属性的名称,并赋值给变量`name`。

整体而言,这段代码通过泛型方法和lambda表达式的使用,实现了从属性访问的lambda表达式中获取属性名称的功能。

0
0 Comments

在C# 6.0中,出现了(Get name of property as a string)这个问题。该问题的原因是在编译时无法直接获取属性的名称作为字符串。然而,通过使用nameof表达式,可以在编译时将属性名解析为字符串形式,从而解决了这个问题。

使用nameof(SomeProperty)表达式,可以在编译时将属性"SomeProperty"解析为字符串形式。这个特性非常强大,对于ModelState.AddModelError调用非常有用。

然而,如果需要对属性名进行混淆(obfuscation),那么nameof就无法工作了。因为nameof是在编译时解析的,而混淆是在运行时应用的。相比之下,第一种方法使用表达式体成员名称可以与混淆一起工作,因为它是在运行时确定的。

总之,通过使用nameof表达式,我们可以在编译时将属性名解析为字符串形式,解决了获取属性名作为字符串的问题。但是在需要对属性名进行混淆的情况下,nameof就无法使用了,需要使用表达式体成员名称的方法来代替。

0
0 Comments

原因:

在这段代码中,作者想要通过lambda表达式获取属性的名称。他引用了一个GetMemberInfo的方法,但是无法找到包含这个方法的程序集或NuGet包。他在MSDN上找到了一个名为"common utilities"的Microsoft Enterprise Library,但是在这个库中并没有找到所需的方法。虽然有一个非官方的包含这个方法的库,但是作者并不满意。

解决方法:

作者提到了两种解决方法。首先,他提到了另一个回答中的方法,这个方法更简洁且不依赖于一个看起来不可用的库。另外,他还提到了可以使用Type.GetMembers方法来替代GetMemberInfo方法。

作者在这段代码中遇到了无法找到GetMemberInfo方法的问题。他提供了两种解决方法,分别是使用另一个回答中的方法或使用Type.GetMembers方法。

0