以安全的方式将PropertyInfo名称与现有属性进行比较

时间:2016-03-16 10:11:46

标签: c# reflection expression

我有一个PropertyInfo,我想检查它是否是特定的。知道它的ReflectedType是正确的,我可以这样做:

bool TestProperty(PropertyInfo prop)
{
    return prop.Name == "myPropertyName";
}

问题是我的财产myPropertyName可能会改变未来的名称,我无法意识到上述代码已经崩溃。

有没有一种安全的方法来测试我想要的东西,可能是使用Expression?

1 个答案:

答案 0 :(得分:1)

如果您可以为该属性设置Expression,则可以从此表达式中检索名称:

public static string PropertyName<T>(this Expression<Func<T, object>> propertyExpression)
{
    MemberExpression mbody = propertyExpression.Body as MemberExpression;

    if (mbody == null)
    {
        //This will handle Nullable<T> properties.
        UnaryExpression ubody = propertyExpression.Body as UnaryExpression;

        if (ubody != null)
        {
            mbody = ubody.Operand as MemberExpression;
        }

        if (mbody == null)
        {
            throw new ArgumentException("Expression is not a MemberExpression", "propertyExpression");
        }
    }

    return mbody.Member.Name;
}

然后你可以用下面的方式使用它:

bool TestProperty(PropertyInfo prop)
{
    return prop.Name == Extensions.PropertyName<TargetClass>(x => x.myPropertyName);;
}