C# 在字符串中定义的我的类名的实例列表

C# 在字符串中定义的我的类名的实例列表,c#,string,list,C#,String,List,我尝试的是将一个列表与前面在字符串变量中定义的类实例化。我甚至不知道这是否可能,但我想是的 string class1 = "class1"; string class2 = "class2"; bool condition = getCondition(); string classToInstanciate = ""; if(condition) classToInstanciate = class1; else classToInstanciate = class2; List dto

我尝试的是将一个列表与前面在字符串变量中定义的类实例化。我甚至不知道这是否可能,但我想是的

string class1 = "class1";
string class2 = "class2";
bool condition = getCondition();

string classToInstanciate = "";
if(condition) classToInstanciate = class1;
else classToInstanciate = class2;
List dtos=Parse(source).ToList()


这是pb,显然这不起作用,但我想将此列表与需要使用的类关联起来。`

C#中类型的泛型类型参数不能松散地表达-它们需要非常明确,因此当您想要混合泛型和反射时,它总是有点混乱

这里的第一项工作是掌握
类型
,而不是
字符串
。如果您可以在整个过程中使用
typeof
,它会简单得多,即

Type classToInstanciate;
if (condition) classToInstanciate = typeof(Class1);
else classToInstanciate = typeof(Class2);
否则,您将不得不使用
Type.GetType(fullyQualifiedName)
someAssembly.GetType(fullName)
等,这会变得很混乱

接下来,您需要从反射(
类型
)切换到泛型(
)。有多种方法可以做到这一点,但最简单的方法通常是:
MakeGenericMethod
。例如:

类SomeType{
//可以将其设置为非公共,但需要指定BindingFlags
//在GetMethod调用中
公共静态列表(whateverArgs){
List dtos=Parse(source).ToList();//无论什么。。。
///
返回DTO;
}
...
私有静态IList调用内容(类型类型,whateverArgs)
{
return(IList)typeof(SomeType).GetMethod(nameof(DoTheThing))
.MakeGenericMethod(type).Invoke(null,whateverArgs);
//上面的“null”是目标实例;在本例中是静态的,因此为null
}
// ...
}
然后您可以使用:

IList list=CallTheThing(classtoinstance,其他参数);

调用站点上的
列表
仅被称为(并且必须是)非通用
IList
API。如果需要使用通用特性(
列表
等),可以在
DoTheThing
中执行。列表本身仍然是一个
列表
(正确的
T
),即使只被称为
IList
——因此不能向其中添加不正确的项目等。

“这不起作用”为什么不?我可以重新措辞吗?您有一个类型名作为字符串(根据某些条件可以更改),您想创建一个
列表
,其中
T
字符串中指定的类型
-对吗?在不同的可能类型之间是否有共同的API?也许是一些常见的基类/接口?或者完全分开?因为这不适用于这个syntaxMarc,是的,这就是我想要实现的。没有通用的API、基类或接口。我需要实例化自定义对象的列表。好吧,您不能真正将编译时的东西转换为运行时提供的类型,这是在您执行代码时。这就是为什么Marc要求使用一个通用的基类型,您可以使用它作为
List
。因为这对你来说似乎是不可能的,所以你只能得到一个
列表
列表
“然后你可以使用:…”,它不会给你strong类型,这根本是不可能的。@HimBromBeere看到最后一行了-它们在
中是“强大的”