从类型创建类实例

时间:2012-12-07 08:36:12

标签: c# winforms reflection activator

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

我知道需要制作的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;
}

如果这是一个更好的方式,我也可以接受这些想法:)

3 个答案:

答案 0 :(得分:5)

只需使用非通用API:

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

我还假设type是一个泛型类型参数;只是说:type令人困惑; <{1}}或T会更加惯用。

另外:这条线需要修理:

TSomethingSpecific

答案 1 :(得分:2)

鉴于<type>objType相同,我建议删除反射并使用where T : new() type constraint

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

修改

如果objTypeT的子类,那么我认为这些内容应该有效:

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

答案 2 :(得分:1)

您可以使用where约束来使用Zach Johnson的建议,因为它消除了类型的重复规范。但是,如果签名是一成不变的,那么您可以使用简单的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限制,因为为了转换为类型,该类型必须是引用类型(aka class)。