使用lambda表达式获取属性名称和类型

时间:2008-11-07 23:05:34

标签: c# reflection lambda

我正在尝试编写一个函数,它将使用如下语法提取属性的名称和类型:

private class SomeClass
{
    Public string Col1;
}

PropertyMapper<Somewhere> propertyMapper = new PropertyMapper<Somewhere>();
propertyMapper.MapProperty(x => x.Col1)

有没有办法将属性传递给函数而不对此语法进行任何重大更改?

我想获取属性名称和属性类型。

所以在下面的例子中我想要检索

Name = "Col1"Type = "System.String"

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:60)

以下是使用Expressions获取属性或字段名称的示例,以帮助您入门:

public static MemberInfo GetMemberInfo<T, U>(Expression<Func<T, U>> expression)
{
    var member = expression.Body as MemberExpression;
    if (member != null)
        return member.Member;

    throw new ArgumentException("Expression is not a member access", "expression");
}

调用代码如下所示:

public class Program
{
    public string Name
    {
        get { return "My Program"; }
    }

    static void Main()
    {
        MemberInfo member = ReflectionUtility.GetMemberInfo((Program p) => p.Name);
        Console.WriteLine(member.Name);
    }
}

但请注意:(Program p) => p.Name的简单陈述实际上涉及相当多的工作(并且可能需要花费大量时间)。考虑缓存结果而不是经常调用该方法。

答案 1 :(得分:3)

我发现这非常有用。

public class PropertyMapper<T>
{
    public virtual PropertyInfo PropertyInfo<U>(Expression<Func<T, U>> expression)
    {
        var member = expression.Body as MemberExpression;
        if (member != null && member.Member is PropertyInfo)
            return member.Member as PropertyInfo;

        throw new ArgumentException("Expression is not a Property", "expression");
    }

    public virtual string PropertyName<U>(Expression<Func<T, U>> expression)
    {
        return PropertyInfo<U>(expression).Name;
    }

    public virtual Type PropertyType<U>(Expression<Func<T, U>> expression)
    {
        return PropertyInfo<U>(expression).PropertyType;
    }
}

我让这个小课程遵循原始要求。 如果您需要该属性的名称,可以像这样使用它:

PropertyMapper<SomeClass> propertyMapper = new PropertyMapper<SomeClass>();
string name = propertyMapper.PropertyName(x => x.Col1);

答案 2 :(得分:3)

我只是想我会把它放在以前的方法上。

public static class Helpers
{
    public static string PropertyName<T>(Expression<Func<T>> expression)
    {
        var member = expression.Body as MemberExpression;
        if (member != null && member.Member is PropertyInfo)
            return member.Member.Name;

        throw new ArgumentException("Expression is not a Property", "expression");
    }
}

然后您可以按以下方式调用它:

Helpers.PropertyName(() => TestModel.TestProperty);

我还应该指出,使用VS 2015和C#6.0,你可以简单地使用nameof。

https://msdn.microsoft.com/en-us/library/dn986596.aspx

答案 3 :(得分:3)

这可以在C#6中轻松完成。要获取属性名称,请使用nameof运算符。

nameof(User.UserId)

并获取属性类型使用typeof运算符。

typeof(User.UserId)