C# - 通用继承和静态成员

时间:2014-03-02 00:21:15

标签: c# generics inheritance 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成员。真棒!

问题是我真的不知道幕后发生了什么。我对泛型的继承知之甚少。有人能告诉我这样做是怎么回事吗?

1 个答案:

答案 0 :(得分:0)

您可以将泛型理解为单独类型的某种通用模板,它们的工作方式相同但不同。

在您的情况下,ChildA继承自Parent<ChildA>ChildB继承自Parent<ChildB>。两种父类型Parent<ChildA>Parent<ChildB>虽然不同,但ChildAChildB 具有共同的基本类型。

如果您确实将Parent<ChildA>Parent<ChildB>声明为真正的单独类型,则可能更容易理解:

class Parent_ChildA { … }
class Parent_ChildB { … }

class ChildA : Parent_ChildA { … }
class ChildB : Parent_ChildB { … }

这就是幕后真正发生的事情。因此,两个父类型是不同的类型,这也解释了为什么它们具有单独的静态成员。毕竟,两个不同的类不会共享静态成员,即使它们具有相同的名称。