我正在尝试编写一个函数,它将使用如下语法提取属性的名称和类型:
private class SomeClass
{
Public string Col1;
}
PropertyMapper<Somewhere> propertyMapper = new PropertyMapper<Somewhere>();
propertyMapper.MapProperty(x => x.Col1)
有没有办法将属性传递给函数而不对此语法进行任何重大更改?
我想获取属性名称和属性类型。
所以在下面的例子中我想要检索
Name = "Col1"
和Type = "System.String"
有人可以帮忙吗?
答案 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。
答案 3 :(得分:3)
这可以在C#6中轻松完成。要获取属性名称,请使用nameof运算符。
nameof(User.UserId)
并获取属性类型使用typeof运算符。
typeof(User.UserId)