我知道这不起作用,但有没有人有办法让它发挥作用?
object obj = new object();
MyType typObj = new MyType();
obj = typObj;
Type objType = typObj.GetType();
List<objType> list = new List<objType>();
list.add((objType) obj);
编辑:
以下是当前代码:http://github.com/vimae/Nisme/blob/4aa18943214a7fd4ec6585384d167b10f0f81029/Lala.API/XmlParser.cs
我尝试简化的方法是SingleNodeCollection
正如您所看到的,它目前使用了如此混乱的反射方法。
答案 0 :(得分:10)
似乎你错过了一个明显的解决方案:
object obj = new object();
MyType typObj = new MyType();
obj = typObj;
List<MyType> list = new List<MyType>();
list.Add((MyType) obj);
如果你真的需要动态路线,那么你可以这样做:
object obj = new object();
MyType typObj = new MyType();
obj = typObj;
Type objType = typObj.GetType();
Type listType = typeof(List<>);
Type creatableList = listType.MakeGenericType(objType);
object list = Activator.CreateInstance(creatableList);
MethodInfo mi = creatableList.GetMethod("Add");
mi.Invoke(list, new object[] {obj});
答案 1 :(得分:1)
你需要反思:
constructor = typeof (MyType).GetConstructor () // doing this from memory, the typeof might be wrong, I'm sure someone will edit it
typObj = (MyType) constructor.Invoke ()
它也可以用于泛型,但这有点棘手。
答案 2 :(得分:1)
你可以使用Generics做这样的事情,但我不确定它的重点是什么。
public List<T> TypedList<T>() where T : new()
{
object obj = new object();
T typObj = new T();
obj = typObj;
List<T> list = new List<T>();
list.Add((T)obj);
return list;
}
答案 3 :(得分:0)
object obj = new object();
Type objType = obj.GetType();
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType));
list.Add(obj);
如果您尝试将某些内容放入无法从objType分配的列表中,您将收到运行时错误。
答案 4 :(得分:0)
更快的是使用Reflection.Emit Here's一个使用Reflection.Emit在运行时实例化任意具体类型的简单示例。为了您的目的,您只需要在示例中调用List的ctor而不是T.ctor。
答案 5 :(得分:0)
即使它似乎得到回答,我仍然没有得到它:)
将“typeToReturn”作为函数的通用参数不是很有用吗?
public List<T> SingleNodeCollection<T>(String xPath, XPathNavigator navigator)
where T : new()
{
XPathNodeIterator nodes = navigator.Select(xPath);
List<T> returnedList = new List<T>(nodes.Count);
...
T newObj = new T();
...
Type t = typeof(T); // need the type anyway?
}
答案 6 :(得分:0)
public class myClass
{
}
myClass instance = new myClass();
Type t = instance.GetType;
// top只是为了显示获取类型...
public object GetListOfType(Type t)
{
Type listType = typeof(List<>);
var listOfType = listType.MakeGenericType(t);
var listOfMyClassInstance = Activator.CreateInstance(listOfType);
return listOfMyClassInstance;
}
但最终你必须直接使用你的类型
List<object> listOfMyClass = GetListOfType(t);
listOfMyClass.Add(myClassInstance);
((myClass)listOfMyClass[0]).SomeProperty
答案 7 :(得分:-2)
我不完全确定你要做什么,但这会有效:
var obj = new MyType();
我可能会误解你的问题。
(我编辑了这个来修复无法编译的示例代码,感谢评论)