我的问题是TypeDescriptor不会从继承的接口返回成员,这是应该如何工作的?还是一个bug?
[TestFixture]
public class DescriptorTests
{
[Test]
public void Test()
{
// count = 1
Assert.AreEqual(2, TypeDescriptor.GetProperties(typeof(IFoo)).Count);
// it is going to fail, the Id is not going to be returned
}
public interface IEntity
{
int Id { get; set; }
}
public interface IFoo : IEntity
{
string Name { get; set; }
}
}
答案 0 :(得分:9)
这不是错误。来自ECMA CLI specification:
8.9.11接口类型推导
接口类型可能需要 实施一个或多个其他 接口。任何实现的类型 支持接口类型 也实施任何支持 由此指定的必需接口 接口。这不同于 对象类型继承有两种方式:
- 对象类型构成单个继承树;接口类型 不
- 对象类型继承指定如何继承实现; 因为,所需的接口没有 接口没有定义 实现。必需的接口 指定其他合同 实施对象类型 支持。
要突出最后的差异, 考虑一个接口,
IFoo
,即 有一个方法。一个界面,IBar
源自它,是 要求任何对象类型 支持IBar
也支持IFoo
。 它没有说明哪个 方法IBar
本身就有。8.10会员继承
只有对象类型可以继承 实现,因此只有对象 类型可以继承成员(参见 §8.9.8)。虽然界面类型可以 从其他接口类型派生, 他们只是“继承”了要求 实现方法契约,永远不会 字段或方法实现。
修改... 强>
如果你想获得界面的属性,包括它的祖先的属性,那么你可以这样做:
var properties = typeof(IFoo)
.GetProperties()
.Union(typeof(IFoo)
.GetInterfaces()
.SelectMany(t => t.GetProperties()));
答案 1 :(得分:1)
你是对的。我认为这是一个错误,因为它适用于类的继承属性!