【问题标题】:How to adapt this answer to a non-generically-typed class?如何使这个答案适应非泛型类?
【发布时间】:2013-01-20 19:34:14
【问题描述】:

我想将 this solution 改编为我现有的实用程序类 - 只是 GetProperty 方法。问题是,我的实用程序类不是通用类型的(即类声明没有像 PropertyHelper 那样的 <T> 参数),我暂时无法添加。

换句话说,我只希望 GetProperty 方法是通用类型的,而不是整个类。

那么我需要进行哪些修改才能使该方法有效?我尝试将 T 添加到该方法的泛型类型列表中:

public static PropertyInfo GetProperty<T, TValue>(Expression<Func<T, TValue>> selector)

但是当我尝试执行以下操作时它会给我错误:

PropertyInfo prop = MyUtilClass.GetProperty<Foo>(x => x.Bar);

显然,这是因为 GetProperty 需要 TTValue...

我只是希望能够像上面那样调用它。怎么样?

【问题讨论】:

  • 你不能,基本上。 C# 不会让您仅推断一种类型参数。你必须有一个泛型类型somewhere
  • 不确定这段旧代码是否有帮助:stackoverflow.com/questions/724143/…

标签: c# .net reflection properties lambda


【解决方案1】:

我可能不了解这个,但如果你想要代码的话:

PropertyInfo prop = MyUtilClass.GetProperty<Foo>(x => x.Bar);

要工作(假设您正在尝试获取有关“x.Bar”的属性信息),您只需将您的函数定义为:

public static PropertyInfo GetProperty<T>(Expression<Func<T, Object>> selector)

然后在你的函数中你会读取成员的名字,就像

MemberExpression member = (MemberExpression)selector.Body;
String propertyName = member.Member.Name;
PropertyInfo info = typeof(T).GetProperty(propertyName, BindingFlags.Public 
            |  BindingFlags.Instance)
return info;

就像我说的,我可能不在基地,但这似乎是你想要做的。

【讨论】:

  • 谢谢。这似乎是我想要的。但是,为什么要更改方法的内部结构(答案中的第三个代码位)?我链接的答案有问题吗?
  • 其实,不,你很好。事实上,我完全忘记了您可以从 MemberExpression 本身获取属性信息数据。呵呵。看来我也学到了一些东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多