如何获得强类型的给定类型的属性名称?

Jen*_*112 2 .net c# reflection expression-trees

我希望能够使用强类型语法检索类型属性的名称.我已经有一个函数来获取实例的属性名称:

public static string PropertyName<T, TReturn>(this T obj, Expression<Func<T, TReturn>> property) where T : class 
{
    MemberExpression body = (MemberExpression) property.Body;
    if (body == null) throw new ArgumentException("The provided expression did not point to a property.");       
    return body.Member.Name;
}
Run Code Online (Sandbox Code Playgroud)

可以这样调用:

Car car = new Car();
car.PropertyName(x => x.Wheels) //returns "Wheels"
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建另一个可以支持以下功能:

Type t = Typeof(Car);
t.PropertyName(x => x.Wheels) //should return "Wheels"
Run Code Online (Sandbox Code Playgroud)

或者只是(甚至更好!):

Car.PropertyName(x => x.Wheels)
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

aba*_*hev 8

您可以重写方法以使用它而无需创建实例:

var prop = ReflectionHelper.PropertyName<Car>(x => x.Wheels);
Run Code Online (Sandbox Code Playgroud)

因为你不需要它而不使用obj内部:

public static class ReflectionHelper
{
    public static string PropertyName<T>(Expression<Func<T, object>> property) where T : class 
    {
        MemberExpression body = (MemberExpression)property.Body;
        return body.Member.Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,返回类型不必是强类型,也可以是object.

  • 你的样本没有编译,因为你在`PropertyName <Car>()`的调用中忘记了第二种类型`TReturn`并且写了`ReflectionHelper.PropertyName <Car,WhellType>(x => x.Wheels); `真的很无聊,因为每次你只想提取它的名字时你都不想显式写入属性类型...... (2认同)