由于某些原因,我需要创建一个对应于某些类属性的PropertyInfo
实例的字典(让我们称之为EntityClass
)。
好的,我可以使用typeof(EntityClass).GetProperties()
。
但我还需要确定某些特定属性的值(在编译时已知)。 通常我可以做以下其中一项:
EntityInstance.PropertyX = Value;
typeof(EntityClass).GetProperty("PropertyX").SetValue(EntityInstance, Value, null);
为了填满我的字典,我需要使用PropertyInfo
个实例而不是正常设置值。但我觉得通过字符串名称获取属性并不舒服。如果某些EntityClass发生更改,则会带来许多异常而不是编译错误。所以,我要问的是:
如何在不传递字符串名称的情况下获取已知属性的PropertyInfo? 如果有像代表一样的话,我会很高兴:
SomeDelegateType MyDelegate = EntityInstance.MethodX;
理想情况下:
SomePropertyDelegate MyPropertyDelegate = EntityInstance.PropertyX;
答案 0 :(得分:9)
这样的东西?
string s = GetPropertyName<User>( x=> x.Name );
public string GetPropertyName<T>(Expression<Func<T, object>> lambda)
{
var member = lambda.Body as MemberExpression;
var prop = member.Member as PropertyInfo;
return prop.Name;
}
或
public PropertyInfo GetPropertyInfo<T>(Expression<Func<T, object>> lambda)
{
var member = lambda.Body as MemberExpression;
return member.Member as PropertyInfo;
}
public class User
{
public string Name { set; get; }
}
答案 1 :(得分:4)
不确定你需要什么,但可能会帮助你继续前进。
public class Property<TObj, TProp>
{
private readonly TObj _instance;
private readonly PropertyInfo _propInf;
public Property(TObj o, Expression<Func<TObj, TProp>> expression)
{
_propInf = ((PropertyInfo)((MemberExpression)expression.Body).Member);
_instance = o;
}
public TProp Value
{
get
{
return (TProp)_propInf.GetValue(_instance);
}
set
{
_propInf.SetValue(_instance, value);
}
}
}
public class User
{
public string Name { get; set; }
}
var user = new User();
var name = new Property<User, string>(user, u => u.Name);
name.Value = "Mehmet";
Console.WriteLine(name.Value == user.Name); // Prints True