2

我在Myclass

public class MyClass{    
    public string FirstName {get;set;}
}

如何在没有字符串的情况下获取PropertyInfo(using ) ?GetProperty("FirstName")

今天我用这个:

PropertyInfo propertyTitleNews = typeof(MyClass).GetProperty("FirstName");

有没有这样的使用方法:

PropertyInfo propertyTitleNews = typeof(MyClass).GetProperty(MyClass.FirstName);

?

4

3 回答 3

6

这里。这个想法是使用表达式树。

public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    return body.Member.Name;
}

然后像这样使用它:

var name = GetPropertyName<MyClass, string>(c => c.FirstName);

如果不需要指定这么多的通用参数,那么一个更简洁的解决方案将是。并且可以通过将MyClass通用参数移动到 util 类来实现:

public static class TypeMember<T>
{
    public static string GetPropertyName<TReturn>(Expression<Func<T, TReturn>> expression)
    {
        MemberExpression body = (MemberExpression)expression.Body;
        return body.Member.Name;
    }
}

然后使用会更干净:

var name = TypeMember<MyClass>.GetPropertyName(c => c.FirstName);
于 2013-11-09T22:09:10.440 回答
3

除了Ivan Danilov 的回答之外,另一种可能性是提供扩展方法:

public static class PropertyInfoExtensions
{
    public static string GetPropertyName<TType, TReturnType>(
        this TType @this,
        Expression<Func<TType, TReturnType>> propertyId)
    {
        return ((MemberExpression)propertyId.Body).Member.Name;
    }
}

然后像这样使用它:

MyClass c;
PropertyInfo propertyTitleNews = c.GetPropertyName(x => x.FirstName);

缺点是您需要一个实例,但优点是您不需要提供通用参数。

于 2013-11-09T22:11:21.067 回答
2

你可以这样做

var property = ExpressionExtensions.GetProperty<MyClass>(o => o.FirstName);

有了这个助手:

public static PropertyInfo GetProperty<T>(Expression<Func<T, Object>> expression)
{
     MemberExpression body = (MemberExpression)expression.Body;
     return typeof(T).GetProperty(body.Member.Name);
}
于 2013-11-09T22:17:54.597 回答