C# 如何创建具有泛型类型参数的对象列表

C# 如何创建具有泛型类型参数的对象列表,c#,oop,C#,Oop,我有一个对象使用类型参数-称之为object-并且需要能够将具有不同类型参数的多个对象添加到列表中,如下所示: var obj1 = new Object<SomeType>(); var obj2 = new Object<SomeOtherType>(); var list = new List<Object<WhatGoesHere>{ obj1, obj2 }; var obj1=新对象(); var obj2=新对象(); var list

我有一个对象使用类型参数-称之为
object
-并且需要能够将具有不同类型参数的多个对象添加到列表中,如下所示:

var obj1 = new Object<SomeType>();
var obj2 = new Object<SomeOtherType>();

var list = new List<Object<WhatGoesHere>{ obj1, obj2 };
var obj1=新对象();
var obj2=新对象();

var list=newlist通常最好创建一个接口。我的大多数泛型类都有接口,可以在不知道泛型参数的情况下使用它们

interface IFoo
{
  object UntypedBlah(object arg);
}

class Foo<T> : IFoo
{
  object UntypedBlah(object arg)
  {
    return Blah((T)arg);
  }

  T Blah(T arg)
  {
    //...
  }

}

List<IFoo> foos = new List<IFoo>();
foos.Add(new Foo<int>());
foos.Add(new Foo<string>());
接口IFoo
{
对象UntypedBlah(对象arg);
}
Foo类:IFoo
{
对象非类型数据库(对象参数)
{
返回Blah((T)arg);
}
T Blah(T arg)
{
//...
}
}
List foos=新列表();
添加(新的Foo());
添加(新的Foo());
  • 你也可以让它协变。(接口将有一个协变的泛型参数。这取决于您在接口上需要的成员是否合理。)
  • 您可以为它们指定相同的名称并显式实现,而不是使用“非类型化”成员。但有时,当您有复杂的接口和类层次结构时,您会遇到麻烦,而只给它们起一个不同的名称可能会更容易

    • 通常最好创建一个接口。我的大多数泛型类都有接口,可以在不知道泛型参数的情况下使用它们

      interface IFoo
      {
        object UntypedBlah(object arg);
      }
      
      class Foo<T> : IFoo
      {
        object UntypedBlah(object arg)
        {
          return Blah((T)arg);
        }
      
        T Blah(T arg)
        {
          //...
        }
      
      }
      
      List<IFoo> foos = new List<IFoo>();
      foos.Add(new Foo<int>());
      foos.Add(new Foo<string>());
      
      接口IFoo
      {
      对象UntypedBlah(对象arg);
      }
      Foo类:IFoo
      {
      对象非类型数据库(对象参数)
      {
      返回Blah((T)arg);
      }
      T Blah(T arg)
      {
      //...
      }
      }
      List foos=新列表();
      添加(新的Foo());
      添加(新的Foo());
      
      • 你也可以让它协变。(接口将有一个协变的泛型参数。这取决于您在接口上需要的成员是否合理。)
      • 您可以为它们指定相同的名称并显式实现,而不是使用“非类型化”成员。但有时,当您有复杂的接口和类层次结构时,您会遇到麻烦,而只给它们起一个不同的名称可能会更容易

      如果类对象中有类型参数,则应向其传递类型。对我来说,你们需要做一些接口,因为你们不能在那个里传递。若你们在类对象中有类型参数,你们应该在那个里传递一个类型。对我来说,你需要做一些接口,因为你不能通过那里的工作。我犯了一点noob错误,在where T:class之后添加了接口,而不是紧跟在类名之后,因此它不是继承的。谢谢你让我再次看了一遍,更清楚地知道我要做什么!成功了。我犯了一点noob错误,在where T:class之后添加了接口,而不是紧跟在类名之后,因此它不是继承的。谢谢你让我再次看了一遍,更清楚地知道我要做什么!