繁体   English   中英

C# - 泛型继承和静态成员

[英]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>是不同的,所以ChildAChildB具有一个共同的基类型。

如果您实际上将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM