我的问题是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; }
}
}发布于 2010-10-27 17:47:24
这不是一个bug。从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()));发布于 2010-10-27 16:43:10
你是正确的。我认为这是一个bug,因为它适用于类的继承属性!
https://stackoverflow.com/questions/4031267
复制相似问题