[英]C# - Generic Inheritance and Static Members
目标是在基类中定义一个静态成员,对于从基类继承的每个子类,静态成员将具有不同的值(在这种情况下,是可枚举属性的列表)。 我知道静态成员是静态的,所以它们“只存在一次”,因此在基类中不能有不同的值。
但我确实想出了一种方法,让它看起来像是有不同的价值。
鉴于此代码:
public class Parent<TSelfReferenceType>
{
public static readonly List<PropertyInfo> enumerableProperties
= GetEnumerableProperties();
public static Type GetTheType()
{
return typeof(TSelfReferenceType);
}
public static List<PropertyInfo> GetEnumerableProperties()
{
return GetTheType().GetProperties()
.Where(property => property.PropertyType.IsEnum)
.ToList();
}
}
public class ChildA : Parent<ChildA>
{
public EnumTypeOne ActivityType { get; set; }
public EnumTypeTwo LogLevel { get; set; }
}
public class ChildB : Parent<ChildB>
{
public EnumTypeThree Source { get; set; }
}
如果我实例化 ChildA 和 ChildB 的实例,它们每个都有一个具有不同值的静态 enumerableProperties 成员。 惊人的!
问题是我真的不知道幕后发生了什么。 我对泛型继承知之甚少。 有人能告诉我是怎么回事使这项工作以这种方式工作吗?
您可以将泛型理解为某种通用模板,用于不同类型的所有工作都相同但不同的类型。
在你的情况, ChildA
继承Parent<ChildA>
并ChildB
继承Parent<ChildB>
两个亲本类型, Parent<ChildA>
和Parent<ChildB>
是不同的,所以ChildA
和ChildB
不具有一个共同的基类型。
如果您实际上将Parent<ChildA>
和Parent<ChildB>
Parent<ChildA>
声明为真正的独立类型,则可能更容易理解:
class Parent_ChildA { … }
class Parent_ChildB { … }
class ChildA : Parent_ChildA { … }
class ChildB : Parent_ChildB { … }
这就是幕后真正发生的事情。 所以两个父类型是独立的类型,这也解释了为什么它们有独立的静态成员。 两个不同的类毕竟不会共享静态成员,即使它们具有相同的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.