我的问题是 TypeDescriptor 不从继承的接口返回成员,这是它应该如何工作的吗?或者这是一个错误?
[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; }
}
}
这不是一个错误。来自ECMA CLI 规范 http://www.ecma-international.org/publications/standards/Ecma-335.htm:
8.9.11 接口类型推导
接口类型可能需要
实施一项或多项其他
接口。任何实现的类型
对接口类型的支持应
还实施对任何
指定的所需接口
界面。这不同于
对象类型继承有两种方式:
- 对象类型形成单一继承树;接口类型
不是。
- 对象类型继承指定了如何继承实现;
所需的接口不需要,因为
接口没有定义
执行。所需接口
指定附加合同
实现对象类型应
支持。
为了突出最后一个区别,
考虑一个接口,IFoo
, 那
有一个单一的方法。一个接口,IBar
,由它派生而来的是
要求任何对象类型
支持IBar
也支持IFoo
。
它没有说任何关于哪个
方法IBar
本身就会有。
8.10 成员继承
只有对象类型可以继承
实现,因此只有对象
类型可以继承成员(参见
§8.9.8)。虽然接口类型可以是
从其他接口类型派生,
他们只是“继承”要求
实施方法契约,永远不要
字段或方法实现。
Edit...
如果您想获取接口的属性,包括其祖先的属性,那么您可以执行以下操作:
var properties = typeof(IFoo)
.GetProperties()
.Union(typeof(IFoo)
.GetInterfaces()
.SelectMany(t => t.GetProperties()));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)