C# 使用表达式获取类的函数属性

C# 使用表达式获取类的函数属性,c#,.net,generics,expression,C#,.net,Generics,Expression,我有一个使用表达式获取属性名的方法 public static void SomeMethod<TProperty>(Expression<Func<TProperty>> property) { var propertyName = property.Name; // Do something, } 现在我面临的问题是,我想为一个我不知道的类对象调用这个方法 void EventHandler(object sender, Propert

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

public static void SomeMethod<TProperty>(Expression<Func<TProperty>> property)
{
    var propertyName = property.Name;
    // Do something,
}
现在我面临的问题是,我想为一个我不知道的类对象调用这个方法

 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中发送正确名称的通用解决方案。

公共静态void SomeMethod(表达式属性)
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 });
}
{ var propertyName=property.Name; //做点什么, } 公共静态void SomeMethod(对象发送方,PropertyInfo属性) { SomeMethod(Expression.Lambda(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; 静态void事件处理程序(对象发送方,PropertyChangedEventArgs e) { var propertyInfo=sender.GetType().GetProperty(e.PropertyName); MakeGenericMethod(propertyInfo.PropertyType).Invoke(null,new[]{sender,propertyInfo}); }
第三次的魅力:-)

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

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

如果您愿意,您可以尝试“欺骗”并调用
SomeMethod(…)
。。然后在EventHandler中,您可以简单地执行以下操作:

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

好吧,我不得不使用这种表达方式。所以我需要通过表达式传递它,不能将字符串发送给方法。如果我直接在EventHandler中调用“SomeMethod(expression.Lambda(expression.Property(expression.Constant(sender),Property));”并删除额外的函数,会怎么样?@FaisalHafeez你不能。您的
SomeMethod
需要定义的泛型类型
t属性
必须在某个地方定义,遗憾的是您没有it@FaisalHafeez显然,您可以尝试作弊:调用SomeMethod并强制转换表达式。Lambda。@FaisalHafeez编写了“装箱”属性值的表达式。但是请注意,其他代码将看不到属性的名称,因为表达式将是Convert(property)而不是property。。。你能更改SomeMethod的签名吗?问题是用泛型调用它非常困难,除非您通过反射调用它。它使用TProperty吗?不,这是第三方的东西,我不能改变。
SomeMethod<object>(Expression.Lambda<Func<object>>(Expression.Convert(Expression.Property(Expression.Constant(sender), propertyInfo), typeof(object))));