为什么C#Type.GetProperty()对于接口的行为与对基类的行为不同?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么C#Type.GetProperty()对于接口的行为与对基类的行为不同?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1347字,纯文字阅读大概需要2分钟。
内容图文
如果类型是接口,为什么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; }
}
解决方法:
请记住,类继承与接口实现不同.
派生类及其基类具有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.
内容总结
以上是互联网集市为您收集整理的为什么C#Type.GetProperty()对于接口的行为与对基类的行为不同?全部内容,希望文章能够帮你解决为什么C#Type.GetProperty()对于接口的行为与对基类的行为不同?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。