我有一个使用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中发送正确名称的通用解决方案。
答案 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))));