English 中文(简体)
C# 列表中的动态类型
原标题:Dynamic type with lists in c#

我有一个小问题给你们。

我想这样做:

Type[] classes = new Type[]{ Class1, Class2 };

foreach(Type t in classes){   
  List<t> list = new List<t>(); 
}

有什么办法吗?

最佳回答

您在运行时不能投放“ 强” / " 强 " 至通用类型, 因为通用类型需要在编译时解决 。

您的“ 坚固” 可以使用反射以动态方式创建通用类型, 但除非您对投影进行硬编码, 否则您得到的回报只能是一个对象 。

我实在不知道你想要什么,我不得不同意一个评论,这就是一个XY问题 。我倾向于冒昧地说,在某个地方,设计问题正在试图解决,而不是直接解决设计问题,或者询问你试图直接实现什么的问题。


您可以使用以下代码创建类型, 然后 动力 类型可以用于 < a href=" http:// en.wikipedia.org/wiki/Duck_typing" rel= "nofollow" > duck 类型 中的各个成员 List<T> , 而不知道/ 显示它是一个列表或什么是 T :

using System;
using System.Collections.Generic;

namespace ConsoleApplication61
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic o = CreateGeneric(typeof(List<>), typeof(int));
            o.Add(1);
            Console.WriteLine(o[0]);
            Console.Read();
        }

        public static object CreateGeneric(Type generic, Type innerType, params object[] args)
        {
            System.Type specificType = generic.MakeGenericType(new System.Type[] { innerType });
            return Activator.CreateInstance(specificType, args);
        }
    }
}

上述样本鸭类型为 Add 方法和索引。 DLR在运行时进行类型处理和鸭键入,例如知道 1 int

为了澄清,我可能不会在生产中使用这种代码(除非你的要求非常具体,需要这样做),而任何与类型匹配有关的问题都会在运行时发生;所以你要么需要非常准确地输入(Intellisense)或者有良好的错误处理。

http://geekswithblogs.net/marcel/archive/2007/03/24//109722.aspx" rel="nofollow" 的博客文章 表示 CreateGeneric 方法。

这个假设是.NET 4 与新的 CLR。 正如@ MartinLiversage 也指出的, 这个特定样本假设您正在以某种强烈类型的方式使用列表。 例如, 我正将 < code>int 转到 < code>List<int> 隐藏在 < code > 动力 中的 。


我们几乎从... NET 4 发布以来就一直在.NET 4上。我们有一个大应用程序,其代码基础甚至更大。在应用程序中, directive 一次没有被使用,在测试代码基础中也只使用过几次。这不是说"不要使用它",而是说"大部分时间,你不需要它"。

问题回答

你可以做到这一点:

foreach(Type t in classes)
{
   var listType = typeof(List<>).MakeGenericType(t);
   var instance = Activator.CreateInstance(listType);
}

使用"Type.MakeGenericType 方法 , 就可以做到这一点。

这里我找到了一种适合你们使用的方法:CodeRef

public static object CreateGeneric(Type generic, Type innerType, params object[] args)
{
    System.Type specificType = generic.MakeGenericType(new System.Type[] { innerType });
    return Activator.CreateInstance(specificType, args);
}

并用它像这样:

var o = CreateGeneric(typeof(List<>), t);

不幸的是,要添加项目,你不得不这样做(如果项目是您要添加的项目) 。

MethodInfo addMethod = o.GetType().GetMethod("Add");
addMethod.Invoke(o, new object[] { item.ToType(t) });

或者使用另一个回答中提到的 < code> Generic 类型。

你可以试试这个:

Type[] classes = new Type[] { typeof(A), typeof(B) };           
foreach (Type t in classes)
{
     Type genericType = typeof(List<>).MakeGenericType(t);
     var list = Activator.CreateInstance(genericType);
}

如果您想要保留到一个列表中的对象, 那么它们可能有共同点 。

在这种情况下,我要争辩说,正如L.B.在评论中提到的那样,你在这里提出一个错误的问题。

可能是您有的设计问题。 想想这些类型, 看看它们有什么共同之处, 看看它们有什么共同之处, 并且想着从一个基类型中产生, 或者让两者都执行同一个界面。 在这种情况下, 您就可以对一个基类型/ 界面对象的列表进行即时处理, 并与这些对象一起工作 。

只是想给你一个开始:

    abstract class Vehicle {
        public int NumberOfWheels { get; set; }
    }

    class Car : Vehicle
    {
        public Car()
        {
            NumberOfWheels = 4;
        }
    }

    class Bicycle : Vehicle
    {
        public Bicycle()
        {
            NumberOfWheels = 2;
        }
    }

    static void Main(string[] args)
    {

        var v1 = new Car();
        var v2 = new Bicycle();

        var list = new List<Vehicle>();
        list.Add(v1);
        list.Add(v2);

        foreach (var v in list)
        {
            Console.WriteLine(v.NumberOfWheels);
        }

        Console.ReadKey();
    }




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签