【问题标题】:Dynamic typing in C#C#中的动态类型
【发布时间】:2010-10-31 09:23:42
【问题描述】:

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

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

如您所见,它目前使用的反射方法如此复杂。

【问题讨论】:

  • 你想达到什么目的?
  • @Daniel:看起来他正在尝试创建一个已存在对象类型的列表。
  • 当你要销毁它时为什么要使用“new object()”(“obj = typObj”)?
  • 其中哪一部分不起作用?您是否遇到编译器错误或运行时异常?
  • @JS Bangs: List list... 不起作用,因为 objType 是一个变量,而不是一个类型。

标签: c# dynamic-typing


【解决方案1】:

您似乎缺少一个明显的解决方案:

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

【讨论】:

    【解决方案2】:

    你需要反思:

    constructor = typeof (MyType).GetConstructor () // doing this from memory, the typeof might be wrong, I'm sure someone will edit it
    typObj = (MyType) constructor.Invoke ()
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        object obj = new object();
        Type objType = obj.GetType();
        IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType));
        list.Add(obj);
        

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

        【讨论】:

          【解决方案5】:

          即使它似乎已回答,我仍然不明白:)

          将“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】:
              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】:

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

              【讨论】:

                【解决方案8】:

                我不完全确定您要做什么,但这是否可行:

                var obj = new MyType();

                我可能误解了你的问题。

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

                【讨论】:

                • var obj;是无效的声明。 var 是一个隐式关键字,这意味着编译器将确定类型是什么。用语句 var obj;编译器没有足够的信息来确定类型。
                猜你喜欢
                • 2021-12-02
                • 1970-01-01
                • 2011-04-05
                • 1970-01-01
                • 1970-01-01
                • 2022-12-03
                • 2010-11-23
                • 2010-12-24
                • 2015-12-19
                相关资源
                最近更新 更多