4

由于某些原因,我需要创建一个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;
4

2 回答 2

10

像这样的东西?

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; }
}
于 2013-05-27T16:55:06.127 回答
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
于 2013-05-27T16:56:21.143 回答