如何创建动态类型List<;T>;

本文关键字:List gt lt 类型 动态 何创建 创建 | 更新日期: 2023-09-27 18:29:07

我不希望我的List是固定类型的。相反,我希望List的创建取决于变量的类型。此代码不起作用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Generic;
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            string something = "Apple";
            Type type = something.GetType();
            List<type> list = null;
            Console.ReadKey();
        }
    }
}

有人能告诉我为了让它正常工作,我需要做什么改变吗?我希望list的创建取决于变量something 的类型

如何创建动态类型List<;T>;

string something = "Apple";
Type type = something.GetType();
Type listType = typeof(List<>).MakeGenericType(new [] { type } );
IList list = (IList)Activator.CreateInstance(listType);

这就是创建静态未知类型列表的方法。但是请注意,您无法静态地提及列表的运行时类型。您必须使用非泛型类型,甚至对象。

在不知道你想完成什么的情况下,这是你能做的最好的事情。

我想要类型安全,但我需要动态类型安全。

如果您希望运行时类型安全,可以使用反射(请参阅usr的答案)或dynamic创建List<T>,然后将其视为非通用IList

使用dynamic,它看起来像这样:

static List<T> CreateListByExample<T>(T obj)
{
    return new List<T>();
}
…
object something = "Apple";
IList list = CreateListByExample((dynamic)something);
list.Add(something); // OK
list.Add(42);        // throws ArgumentException

动态和反射都能很好地工作-但在性能上有缺点-并失去了强类型、代码设计/清晰度等。
即,您应该始终尝试在没有它的情况下解决问题-如果可以,您的代码允许…
因此,(注意)(非常)取决于您的特定代码,需要,
您还可以使用"trick"来"推断"类型并使其通用。。。

class Program
{
    static void Main(string[] args)
    {
        string something = "Apple";
        int test = 5;
        var list = something.GetList();
        var listint = test.GetList();
        Console.WriteLine(list.GetType());
    }
}
static class Extension
{
    public static List<T> GetList<T>(this T value)
    {
        return new[] { value }.ToList();
    }
}

即,如果您有一个变量的值,并且在"输入"通用上下文之前,
你可以使用扩展(这对解决这个问题很有帮助),并让它为您推断类型和列表类型
注意:不幸的是,当你的代码"太动态"时(我知道这不是太"精确",但超出了范围),如果它取决于反射引发的类型等,这种"变通方法"并不总是可行的。
也就是说,没有一个干净的解决方案,这只是一个例子,你需要付出一些汗水:)让它为你工作-例如,你可能需要一个包装器类型,很明显,以这种方式创建列表可能不是你想要的

编译器在编译时必须知道泛型类型T。所以不,你真的不能这么做。