Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用lambda表达式获取属性名称和类型_C#_Reflection_Lambda - Fatal编程技术网

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

C# 使用lambda表达式获取属性名称和类型,c#,reflection,lambda,C#,Reflection,Lambda,我正在尝试编写一个函数,该函数将使用如下语法提取属性名称和类型: private class SomeClass { Public string Col1; } PropertyMapper<Somewhere> propertyMapper = new PropertyMapper<Somewhere>(); propertyMapper.MapProperty(x => x.Col1) 私有类SomeClass { 公共字符串Col1; } Prop

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

private class SomeClass
{
    Public string Col1;
}

PropertyMapper<Somewhere> propertyMapper = new PropertyMapper<Somewhere>();
propertyMapper.MapProperty(x => x.Col1)
私有类SomeClass
{
公共字符串Col1;
}
PropertyMapper PropertyMapper=新的PropertyMapper();
propertyMapper.MapProperty(x=>x.Col1)
是否有任何方法可以将属性传递给函数,而不对此语法进行任何重大更改

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

因此,在下面的示例中,我希望检索

Name=“Col1”
Type=“System.String”


有人能帮忙吗?

这里有足够的一个示例,说明如何使用来获取属性或字段的名称,以便开始使用:

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");
}

不过需要注意的是:
(Program p)=>p.Name
的简单陈述实际上需要相当多的工作(并且可能需要相当长的时间)。考虑缓存结果而不是频繁调用方法。

我发现这非常有用。

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;
    }
}
公共类属性映射
{
公共虚拟属性yinfo PropertyInfo(表达式)
{
var member=expression.Body作为MemberExpression;
if(member!=null&&member.member为PropertyInfo)
返回成员。成员作为PropertyInfo;
抛出新ArgumentException(“表达式不是属性”、“表达式”);
}
公共虚拟字符串PropertyName(表达式)
{
返回PropertyInfo(表达式).Name;
}
公共虚拟类型PropertyType(表达式)
{
返回PropertyInfo(表达式).PropertyType;
}
}
我按照最初的要求上了这个小班。 如果需要属性的名称,可以如下使用:

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);
    }
}
PropertyMapper<SomeClass> propertyMapper = new PropertyMapper<SomeClass>();
string name = propertyMapper.PropertyName(x => x.Col1);
PropertyMapper PropertyMapper=newpropertymapper();
字符串名称=propertyMapper.PropertyName(x=>x.Col1);

我只是想在前面的方法的基础上把它放在这里

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");
    }
}
我还应该指出,在VS 2015和C#6.0中,您可以简单地使用nameof


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

nameof(User.UserId)
typeof(User.UserId)
要获取属性类型,请使用typeof运算符

nameof(User.UserId)
typeof(User.UserId)

更大的图景是什么?为什么不将“Col1”作为字符串名传递并使用反射来查找该成员?是什么激发了lambda?我正在为我的工作制作一个内部ORM。我想在不必到处搜索字符串的情况下轻松地支持更改属性名称,并且(在我看来)它提供了一个干净的语法。请记住,lambda表达式可以转换为委托或表达式树。注意:GetMemberInfo实现不是很安全。也就是说你可以用它来读名字。但是返回的成员信息本身并不准确。