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看到最后一行了-它们在中是“强大的”