C# - 子类类型列表

时间:2017-03-22 17:33:15

标签: c# list class generics types

我想要一个类类型列表(不是类实例列表),其中List的每个成员都是MyClass的子类。

例如,我可以这样做:

List<System.Type> myList;
myList.Add(typeof(mySubClass));

但我想限制列表只接受MyClass的子类。

这与问题like this不同。 理想情况下,我想避免使用linq,因为它在我的项目中目前尚未使用。

2 个答案:

答案 0 :(得分:3)

Servy is right in his commentLee in hisit's much more preferable to compose than inherit。所以这是一个很好的选择:

public class ListOfTypes<T>
{
    private List<Type> _types = new List<Type>();
    public void Add<U>() where U : T
    {
        _types.Add(typeof(U));
    }
}

用法:

var x = new ListOfTypes<SuperClass>();
x.Add<MySubClass>()

请注意,如果您希望为其他代码提供对包含的Type的读取访问权限而不需要依赖此类的其他代码,则可以使此类实现类似IReadOnlyList<Type>的接口。

但是如果你想继承,你可以创建自己的继承自List的类,然后像这样添加你自己的通用Add方法:

public class ListOfTypes<T> : List<Type>
{
    public void Add<U>() where U : T
    {
        Add(typeof(U));
    }
}

请注意what Lee said:使用第二个版本,您仍然可以Add(typeof(Foo))

答案 1 :(得分:1)

您应该从List派生一个列表类,并覆盖Add方法以执行您需要的类型检查。我不知道.NET会自动执行此操作。

这样的事情可行:

public class SubTypeList : List<System.Type>
{
    public System.Type BaseType { get; set; }

    public SubTypeList()
        : this(typeof(System.Object))
    {
    }

    public SubTypeList(System.Type baseType)
    {
        BaseType = BaseType;
    }

    public new void Add(System.Type item)
    {
        if (item.IsSubclassOf(BaseType) == true)
        {
            base.Add(item);
        }
        else
        {
            // handle error condition where it's not a subtype... perhaps throw an exception if
        }
    }
}

您需要更新向列表添加/更新项目的其他方法(索引设置器,AddRange,插入等)