我在Myclass
中有一个属性:
public class MyClass{
public string FirstName {get;set;}
}
如何在没有字符串的情况下获取PropertyInfo
(使用GetProperty("FirstName")
)?
今天我用这个:
PropertyInfo propertyTitleNews = typeof(MyClass).GetProperty("FirstName");
有没有这样的使用方式:
PropertyInfo propertyTitleNews = typeof(MyClass).GetProperty(MyClass.FirstName);
答案 0 :(得分:6)
见here。我们的想法是使用表达树。
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
泛型param移动到util class:
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);
答案 1 :(得分:2)
除Ivan Danilov's answer旁边的另一种可能性是提供扩展方法:
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);
缺点是您需要一个实例,但优点是您不需要提供通用参数。
答案 2 :(得分:1)
你可以那样做
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);
}