【问题标题】:Get Interface Properties through reflection通过反射获取接口属性
【发布时间】:2013-08-24 13:44:20
【问题描述】:

我广泛使用foovar.GetType().GetProperty("PropertyName").GetValue(foovar) 通过反射获取变量变量的属性值。但它似乎不适用于接口类型。

IFoo foo = GetFoo();
string fooName= foo.Name; //It works perfectly

我正在与第三方程序集合作,因此我无权访问实施。有一个“名称”属性,我可以获得值。但不能通过反射。

当我尝试string s = (string)foo.GetType().GetProperty("Name").GetValue(foo); 时,我得到一个空错误:没有“名称”属性

我检查了PropertyInfo[] pi = foo.GetType().GetProperties();,我可以看到大约 200 个属性,这些都不是“名称”。事实上,许多其他“智能感知属性”并没有出现。

¿如何检索接口类型的属性值?

谢谢!

【问题讨论】:

  • 为什么需要反射?您是否尝试过使用 ILSpy、dotPeek 或 Reflector 来查看实现?
  • 我有需要在运行时访问的类型至极属性。它有很多,不同类型。我通过数据库或 XML 获取每次需要使用的属性名称和属性类型,然后使用反射和泛型获取值。

标签: c# reflection interface


【解决方案1】:

返回的对象可能会显式实现IFoo,因此Name 属性将是私有的。 您可以改用接口类型:

object property = typeof(IFoo).GetProperty("Name").GetValue(foo);

编辑:如果这不起作用,那么我只能假设该属性实际上是在 IFoo 实现的其他接口上定义的,例如

public interface IBase
{
    string Name { get; }
}

public interface IFoo : IBase
{
}

在这种情况下,您需要找到声明 Name 的实际接口并使用它。

【讨论】:

  • 对不起,它一直给我错误。事实上,当我尝试 'typeof(IFoo).GetProperties()' 时,我的属性与我尝试 'foo.GetType().Getproperties()' 时的属性相同
  • 谢谢!按照您的想法,在编辑器中,通过“智能感知”,我看到 IFoo 中的属性被定义为“字符串 IBase.Name”。所以解决方法是'string s = (string)typeof(IBase).GetProperty("Name").GetValue(foo);'即使 'foo' 被定义为 IFoo。 :) 顺便说一句,你知道有什么方法可以查询一个接口的底层实现,这样我就可以通过代码得到这个(名称实际上是 IBase.Name)?
猜你喜欢
  • 2014-08-27
  • 2012-01-23
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2012-05-06
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多