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实现不是很安全。也就是说你可以用它来读名字。但是返回的成员信息本身并不准确。