如果类型是接口,为什么没有Type.GetProperty(string)
从基接口获取属性?例如,以下代码打印:
System.String X
null
System.String X
System.String X
似乎不一致:
void Main()
{
Console.WriteLine(typeof(I1).GetProperty("X"));
Console.WriteLine(typeof(I2).GetProperty("X"));
Console.WriteLine(typeof(C1).GetProperty("X"));
Console.WriteLine(typeof(C2).GetProperty("X"));;
}
public interface I1 { string X { get; } }
public interface I2 : I1 { }
public class C1 { public string X { get { return "x"; } } }
public class C2 : C1 { }
编辑:支持Cole答案的运行时的另一个方面如下:
public class C : I2 {
// not allowed: the error is
// 'I2.X' in explicit interface declaration is not a member of interface
string I2.X { get; set; }
// allowed
string I1.X { get; set; }
}
答案 0 :(得分:6)
请记住,类继承与接口实现不同。
派生类及其基类具有 is-a 关系。如果D : B
则D
为 B
。如果B
具有属性,则D
根据定义也会具有相同的属性,因为这就是意味着的关系; D
的“实质”在某种意义上因与B
的关系而改变。
接口不提供任何实现,因此当您说ID : IB
时,您并不是真的说ID
是 IB
,就像您做的那样与课程。这甚至意味着什么? ID
和IB
不是的东西;他们是协议。没有什么可以改变的。相反,您说“实现ID
的类还必须为IB
提供实现。”
ID
派生自IB
的事实不会改变ID
,因为它没有任何改变的实质。它只是意味着任何承诺履行ID
规定的合同的类也必须准备好遵守一套额外的要求。
请注意,如果IB
提供了属性X
,那么“ID
具有属性X
的正确答案是什么?”是否。 ID
要求您同时实施IB
,其中 具有属性X
,但它本身没有属性X
。