我想获得一个类的私有属性的名称。 原因是我想设置该类的属性,稍后将对其进行模糊处理。到目前为止我所拥有的是:
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
。
我希望你明白我的意思。
感谢您的帮助。
答案 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;
}