通用类型的集合

Jer*_*emy 31 .net c# generics

如果我有一个泛型类:

public class MyClass<T> 
{
  public T Value;
}
Run Code Online (Sandbox Code Playgroud)

我想实例化几个项目,如...

new MyClass<string>
new MyClass<int>
Run Code Online (Sandbox Code Playgroud)

...并将它们添加到集合中.如何定义集合以便它可以包含泛型类型列表?然后我想在某个时刻迭代集合,并使用Value属性.可能?

Dan*_*Tao 30

让您的泛型类继承自非泛型基类,或实现非泛型接口.然后,您可以拥有此类型的集合,并在您用于访问集合内容的任何代码中进行转换.

这是一个例子.

public abstract class MyClass
{
    public abstract Type Type { get; }
}

public class MyClass<T> : MyClass
{
    public override Type Type
    {
        get { return typeof(T); }
    }

    public T Value { get; set; }
}

// VERY basic illustration of how you might construct a collection
// of MyClass<T> objects.
public class MyClassCollection
{
    private Dictionary<Type, MyClass> _dictionary;

    public MyClassCollection()
    {
        _dictionary = new Dictionary<Type, MyClass>();
    }

    public void Put<T>(MyClass<T> item)
    {
        _dictionary[typeof(T)] = item;
    }

    public MyClass<T> Get<T>()
    {
        return _dictionary[typeof(T)] as MyClass<T>;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,不能添加相同T的多个项目.例如,集合不能包含两个`MyClass <string>`. (4认同)

Rob*_*Rob 8

我能想到的唯一方法就是如下(包含在Console应用程序中进行测试):

class Program
{
    static void Main(string[] args)
    {
        var x = new MyClass<string>() { Value = "34" };
        var y = new MyClass<int>() { Value = 3 };

        var list = new List<IMyClass>();
        list.Add(x);
        list.Add(y);

        foreach (var item in list)
        {
            Console.WriteLine(item.GetValue);
        }
    }

    private interface IMyClass
    {
        object GetValue { get; }
    }

    private class MyClass<T> : IMyClass
    {
        public T Value;

        public object GetValue
        {
            get
            {
               return Value;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

即,让MyClass实现一个空接口,然后将您的集合创建为一个包含实现该接口的类实例的集合.

更新: 我在接口中添加了一个"GetValue"方法,允许您以对象的形式访问MyClass实例的"Value".如果你想拥有一个拥有混合类型的集合,这就像它将要获得的那样好.