为什么C#Type.GetProperty()对于接口的行为与对基类的行为不同?

时间:2013-03-14 20:32:47

标签: c# reflection properties

如果类型是接口,为什么没有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; }
}

1 个答案:

答案 0 :(得分:6)

请记住,类继承与接口实现不同。

派生类及其基类具有 is-a 关系。如果D : BD B。如果B具有属性,则D根据定义也会具有相同的属性,因为这就是意味着的关系; D的“实质”在某种意义上因与B的关系而改变。

接口不提供任何实现,因此当您说ID : IB时,您并不是真的说ID IB,就像您做的那样与课程。这甚至意味着什么? IDIB不是的东西;他们是协议。没有什么可以改变的。相反,您说“实现ID的类还必须为IB提供实现。”

ID派生自IB的事实不会改变ID,因为它没有任何改变的实质。它只是意味着任何承诺履行ID规定的合同的类也必须准备好遵守一套额外的要求。

请注意,如果IB提供了属性X,那么“ID具有属性X的正确答案是什么?”是ID要求您同时实施IB,其中 具有属性X,但它本身没有属性X