通过反射获取私有财产的名称而不使用字符串

时间:2017-07-31 09:00:11

标签: c# reflection

我想获得一个类的私有属性的名称。 原因是我想设置该类的属性,稍后将对其进行模糊处理。到目前为止我所拥有的是:

public static string GetPropertyName<T>(Expression<Func<T, object>> expression)
{
    var lambda = expression as LambdaExpression;
    MemberExpression memberExpression;
    var unaryExpression = lambda.Body as UnaryExpression;
    if (unaryExpression != null)
        memberExpression = unaryExpression.Operand as MemberExpression;
    else
        memberExpression = lambda.Body as MemberExpression;

    if (memberExpression == null)
        throw new ArgumentException("Expression must point to a Property");

    return memberExpression.Member.Name;
}

像这样被召唤

private static readonly string DisplayNameProperty = ReflectionUtil.GetPropertyName<MyClass>(x => x.MyPublicProperty);

上一个示例显示了Util与公共属性的使用,它完美地运行。 但是在一个私有财产上它显然不会起作用,因为它显然是私有的。

现在可行的是:

typeof(MyClass).GetProperty("MyPrivateProperty", BindingFlags.NonPublic | BindingFlags.Instance)
                .SetValue(_myInstance, true, null);

但是在被混淆之后,该属性将不再被称为MyPrivateProperty

我希望你明白我的意思。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

由于该属性是私有的,因此无法创建以其为目标的编译时表达式。你可以做的是用自定义属性装饰你正在寻找的属性,并通过反射搜索。

以下是使用随机CustomAttribute的简单示例:

using System;
using System.Reflection;
using System.Linq;

public class C {
    [ObsoleteAttribute]
    private string P {get; set;}
}

public class C2
{
    String x = typeof(C)
        .GetProperties((BindingFlags)62)
        .Single(x => x.GetCustomAttribute<ObsoleteAttribute>() != null)
        .Name;
}