2

我正在尝试创建一个可以以通用方式添加到列表中的类的实例..

我知道type需要制作的类,并且我已经能够object使用下面的代码制作类,但我还没有找到一种方法来创建允许我将其添加到列表中的演员表.. 任何想法?

T 与 objType 相同

public static List<T> LoadList(string fileName, Type objType)
{
    List<T> objList = new List<T>();
    object o = Activator.CreateInstance(objType);
    objList.Add((**o.GetType()**)o);
    return objList;
}

如果有更好的方法来做这件事,我对想法持开放态度:)

4

3 回答 3

5

只需使用非通用 API:

((IList)objList).Add(o);

我还假设这type是一个通用类型参数;只是说:type对此感到困惑;T或者TSomethingSpecific会更惯用。

另外:这条线需要修复:

List<type> objList = new List<type>(); // <=== not new List<Object>
于 2012-12-07T08:37:41.920 回答
2

鉴于这<type>与 相同objType,我建议放弃反射并使用where T : new() 类型约束

public static List<T> LoadList(string fileName) 
    where T : new()
{
    List<T> objList = new List<T>();
    objList.add(new T());
    return objList;
}

编辑:

如果objType是 的子类T,那么我认为这些方面的东西应该可以工作:

public static List<TListType, T> LoadList(string fileName)
    where T : TListType, new()
{
    List<TListType> objList = new List<TListType>();
    objList.add(new T());
    return objList;
}
于 2012-12-07T08:45:46.907 回答
1

您可以使用带有约束的 Zach Johnson 的建议,where因为它消除了类型的重复规范。但是,如果签名是一成不变的,您可以通过简单的as演员表来解决,例如:

public List<T> LoadList<T>(Type objType) where T : class
{
  List<T> objList = new List<T>();
  T item = (Activator.CreateInstance(objType) as T);
  objList.Add(item);
  return objList;
}

这也需要 where 限制,因为要转换为类型,该类型必须是引用类型(又名类)。

于 2012-12-07T09:35:09.147 回答