我正在尝试创建一个类的实例,我可以通用的方式添加到列表中。
我知道需要制作的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;
}
如果这是一个更好的方式,我也可以接受这些想法:)
答案 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;
}
修改强>
如果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;
}
答案 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)。