使用Expression获取类的Function属性

时间:2013-08-19 07:02:22

标签: c# .net generics expression

我有一个使用Expression获取属性名称的方法。

public static void SomeMethod<TProperty>(Expression<Func<TProperty>> property)
{
    var propertyName = property.Name;
    // Do something,
}

我可以为我的类调用此函数。

SomeMethod(()=> SomePropertyName);

现在我面临的问题是我想为一个我不知道的类对象调用这个方法。

 void EventHandler(object sender, PropertyChangedEventArgs e)
 {
     var propertyInfo = sender.GetType().GetProperty(e.PropertyName);
     SomeMethod(() => propertyInfo);  // Problem Here.
 }

现在的问题是,当这个EventHandler调用SomeMethod时,方法名称变为propertyInfo而不是e.PropertyName(无论这包含什么)。发送者可以是不同类型的,e.PropertyName也可以是不同类型。我正在寻找一个在SomeMethod中发送正确名称的通用解决方案。

1 个答案:

答案 0 :(得分:1)

public static void SomeMethod<TProperty>(Expression<Func<TProperty>> property)
{
    var propertyName = property.Name;
    // Do something,
}

public static void SomeMethod<TProperty>(object sender, PropertyInfo property)
{
    SomeMethod(Expression.Lambda<Func<TProperty>>(Expression.Property(Expression.Constant(sender), property)));
}

public static MethodInfo someMethod = typeof(TypeContainingSomeMethod).GetMethod("SomeMethod", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object), typeof(PropertyInfo) }, null);

static void EventHandler(object sender, PropertyChangedEventArgs e)
{
    var propertyInfo = sender.GetType().GetProperty(e.PropertyName);
    someMethod.MakeGenericMethod(propertyInfo.PropertyType).Invoke(null, new[] { sender, propertyInfo });
}

第三次的魅力: - )

相当复杂......必须使用反射,因为你的方法有一个通用参数,在编译时显然无法解决。

请注意,这适用于属性...对于字段,需要进行一些更改。

如果您愿意,可以尝试“作弊”并拨打SomeMethod<object>(...) ..然后在EventHandler中您可以这样做:

SomeMethod<object>(Expression.Lambda<Func<object>>(Expression.Convert(Expression.Property(Expression.Constant(sender), propertyInfo), typeof(object))));