C#中的动态类型转换

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。

正如您所看到的,它目前使用了一些拼凑在一起的反射方法。


你想要实现什么目标? - Mitch Wheat
2
@Daniel:看起来他正在尝试创建一个已存在对象类型的列表。 - Welbog
3
为什么在即将销毁一个对象时要使用 "new object()"("obj = typObj")? - John Saunders
这段代码的哪一部分出了问题?你是遇到编译错误还是运行时异常? - JSBձոգչ
@JS Bangs:List<objType> list...无法工作,因为objType是一个变量,而不是一种类型。 - mmmmmmmm
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});

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 ()

对于泛型也可以这样做,但那会有些棘手。


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;
}

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?
}

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

0
object obj = new object();
Type objType = obj.GetType();
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType));
list.Add(obj);

如果您尝试将不可从objType分配的内容放入列表中,则会出现运行时错误。


0
更快的方法是使用Reflection.Emit。这里有一个简单的示例,演示了如何在运行时实例化任意具体类型。对于您的目的,您只需要让它调用List的ctor而不是像示例中的T.ctor即可。

-2
我不太确定你想做什么,但这个代码可以吗:
var obj = new MyType();
不过我可能误解了你的问题。
(我编辑了一下样例代码,因为之前的代码无法编译。谢谢评论区的指正)

"var obj;" 是无效的声明。 "var" 是一个隐式关键字,这意味着编译器将确定类型。使用语句 "var obj;",编译器将无法获得足够的信息来确定类型。 - Timothy Carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接