C# 将类型传递给方法以在泛型中使用

C# 将类型传递给方法以在泛型中使用,c#,generics,.net-core,C#,Generics,.net Core,我试图理解为什么下面的代码不起作用,以及我需要如何修改它使其起作用。简而言之,我试图将一个类型传递到方法中,然后在声明列表时使用该类型 public void TestMethod(Type type) { List<type> items = new List<type>(); } 我得到一个错误:“type”是一个变量,但它的用法与type类似 谢谢 那将是: public void TestMethod<T>() { List<T

我试图理解为什么下面的代码不起作用,以及我需要如何修改它使其起作用。简而言之,我试图将一个类型传递到方法中,然后在声明列表时使用该类型

public void TestMethod(Type type)
{
    List<type> items = new List<type>();
}
我得到一个错误:“type”是一个变量,但它的用法与type类似

谢谢

那将是:

public void TestMethod<T>()
{
    List<T> items = new List<T>();
}
至于这个理论,评论里的人解释得很好。您可以随时查看有关泛型的文档:

,这将是:

public void TestMethod<T>()
{
    List<T> items = new List<T>();
}

至于这个理论,评论里的人解释得很好。您可以随时查看有关泛型的文档:

如果没有反射,您无法执行此操作。但是,您可以通过反射来实现

string typeName = "System.String";
Type typeArg = Type.GetType(typeName);

Type genericClass = typeof(List<>);
Type newClass = genericClass.MakeGenericType(typeArg);

object created = Activator.CreateInstance(newClass);

你不能不思考就这样做。但是,您可以通过反射来实现

string typeName = "System.String";
Type typeArg = Type.GetType(typeName);

Type genericClass = typeof(List<>);
Type newClass = genericClass.MakeGenericType(typeArg);

object created = Activator.CreateInstance(newClass);

当您使用泛型时,您需要知道在编译时要将哪些类型用作类型参数。类型是运行时才知道的类型。如果在编译时知道类型,请将方法更改为:public void TestMethod{List items=new List;}如果在编译时不知道类型,可以使用反射创建列表。类型的实例是描述类型的对象。如果您有一个像System.String这样的类型名,那么您可以通过说出typeofSystem.String来获得相应的类型实例,使用typename作为文本。当您创建一个泛型类型(如List)的实例时,需要将文本类型名称作为示例List。如果要基于传递到函数中的类型实例创建某个对象的列表,则需要使用reflection有一种从类型转换为泛型的方法,但它非常难看,并且涉及运行时反射MakeGenericType/MakeGenericMethod。如果可能的话,现在就停下来,意思是:使用另一种解决方案-它很快就会变得难看。感谢你帮助我更好地理解这一点。当你使用泛型时,你需要知道你想在编译时使用什么类型作为类型参数。类型是运行时才知道的类型。如果在编译时知道类型,请将方法更改为:public void TestMethod{List items=new List;}如果在编译时不知道类型,可以使用反射创建列表。类型的实例是描述类型的对象。如果您有一个像System.String这样的类型名,那么您可以通过说出typeofSystem.String来获得相应的类型实例,使用typename作为文本。当您创建一个泛型类型(如List)的实例时,需要将文本类型名称作为示例List。如果要基于传递到函数中的类型实例创建某个对象的列表,则需要使用reflection有一种从类型转换为泛型的方法,但它非常难看,并且涉及运行时反射MakeGenericType/MakeGenericMethod。如果可能的话,现在就停下来,意思是:使用另一种解决方案-它很快就会变得难看。感谢你帮助我更好地理解这一点。在这一点上,真正的诀窍是,在一般情况下,你能说的关于创建的变量的唯一一件事是它是一个对象。你不能把它变成任何有用的东西。在这种特殊情况下,您可以将其转换为非泛型IList,这使它有些有用。这是@MarcGravel所指的丑陋的快速路径真正的技巧,在这一点上,对于一般情况下创建的变量,你唯一能说的就是它是一个对象。你不能把它变成任何有用的东西。在这种特殊情况下,您可以将其转换为非泛型IList,这使它有些有用。这是@MarcGravel所指的丑陋的快速路径