7

我知道这不起作用,但是有没有人有办法让它起作用?

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

正如你所看到的,它目前使用了如此复杂的反射方法。

4

8 回答 8

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});
于 2009-06-04T16:08:20.770 回答
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 ()

它也可以用于泛型,但这有点棘手。

于 2009-06-04T16:09:03.563 回答
1

您可以使用泛型做这样的事情,但我不确定它的意义是什么。

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;
}
于 2009-06-04T16:13:23.000 回答
0
object obj = new object();
Type objType = obj.GetType();
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType));
list.Add(obj);

这样,如果您尝试将无法从 objType 分配的内容放入列表中,您将收到运行时错误。

于 2009-06-04T16:15:48.243 回答
0

更快的是使用 Reflection.Emit 这是一个使用 Reflection.Emit 在运行时实例化任意具体类型的简单示例。出于您的目的,您只需让它调用 List 的 ctor 而不是示例中的 T.ctor 。

于 2009-06-04T16:22:45.230 回答
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?
}
于 2009-07-02T21:57:39.573 回答
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
于 2011-04-29T16:21:49.200 回答
-2

我不完全确定您要做什么,但这会起作用吗:

var obj = new MyType();

不过我可能误解了你的问题。

(我对此进行了编辑以修复无法编译的示例代码,感谢您的评论)

于 2009-06-04T16:18:17.417 回答