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))));