我很确定这与实现接口和继承有关。
在c#中,System.Type类如何具有属性Name?当我从元数据或使用对象浏览器示例Type类的代码时,我看到Type类没有:
string Name
定义在任何地方。
我也看到Type继承自MemberInfo并实现了_Type和IReflect(就像这样):
public abstract class Type : MemberInfo, _Type, IReflect
基类MemberInfo具有以下属性:
public abstract string Name { get; }
据我所知,由于abstract修饰符,这个有在派生类中被覆盖。我没有在Type ...中看到它。
然后在_Type接口中有一个属性:
string Name { get; }
因为它在一个接口中,它也没有自己的实现。
在哪里定义Name以及它如何在System.Type类中有值?或者我不明白继承和实现接口如何适用于此类
答案 0 :(得分:10)
请注意System.Type
本身就是一个抽象类。这意味着它可以在子类中重写。事实上,如果您执行以下操作,您可以看到运行时类型实际上不是System.Type
:
typeof(Type).GetType().FullName; // System.RuntimeType
System.RuntimeType
是您在文档中看不到的内部类型,但 会覆盖Name
属性。它看起来有点像这样:
namespace System
{
internal class RuntimeType : Type, ISerializable, ICloneable
{
...
public override string Name
{
get { ... }
}
}
}
类型是一个允许多个实现的抽象基类。系统将始终提供派生类RuntimeType。在反射中,所有以单词Runtime开头的类只在系统中的每个对象上创建一次并支持比较操作。
答案 1 :(得分:1)
来自Name
的抽象属性MemberInfo
确实由System.Type
继承。
System.Type
可以实现接口的原因是,允许抽象实例成员实现接口,只要该成员是公共的,当然是Name
。实现接口的成员可以从基类继承。
System.Type
允许不覆盖Name
属性的原因是System.Type
本身就是一个抽象类。所以它可以“留下”抽象成员而不实现。从中派生的非抽象类型仍必须为此属性(其get
访问者)提供实现。
如果您有变量Type t = ...;
并在其上调用t.Name
,则t
的 运行时类型 将具有成为一些非抽象类,该类将具有Name
的实现。