0

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

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 (无论它包含什么)。sender 在这里可以是不同的类型,e.PropertyName 也可以是不同的类型。我正在寻找在 SomeMethod 中发送正确名称的通用解决方案。

4

1 回答 1

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))));
于 2013-08-19T07:14:08.293 回答