给定一个包含类名称的字符串,如何使用该类作为C#中的类型参数来调用泛型方法?

给定一个包含类名称的字符串,如何使用该类作为C#中的类型参数来调用泛型方法?,c#,generics,methods,types,C#,Generics,Methods,Types,我在SQLite Net中使用CreateTable方法,它使用一个类型参数来指定正在创建的表的类型。例如: database.CreateTable<Client>(); 将使用客户机类中定义的模式创建一个表,因此具有ClientID、Name和Type列 我想使用一个字符串数组,保存我要创建的表的名称,在数组中命名的所有类上运行CreateTable。但是,我不确定如何在泛型方法中使用字符串作为类型参数 它看起来像这样: string[] tables = new string

我在SQLite Net中使用CreateTable方法,它使用一个类型参数来指定正在创建的表的类型。例如:

database.CreateTable<Client>();
将使用客户机类中定义的模式创建一个表,因此具有ClientID、Name和Type列

我想使用一个字符串数组,保存我要创建的表的名称,在数组中命名的所有类上运行CreateTable。但是,我不确定如何在泛型方法中使用字符串作为类型参数

它看起来像这样:

string[] tables = new string[]{"Class1","Class2"};
for(int i = 0; i < tables.Length; i++){
    database.CreateTable<tables[i]>();
}
Type tabletype = Type.GetType("Client");
database.CreateTable<tabletype>();
string[]tables=新字符串[]{“Class1”、“Class2”};
for(int i=0;i
这将做与此相同的事情:

database.CreateTable<Class1>():
database.CreateTable<Class2>();
database.CreateTable():
CreateTable();
我已经试过这样做:

string[] tables = new string[]{"Class1","Class2"};
for(int i = 0; i < tables.Length; i++){
    database.CreateTable<tables[i]>();
}
Type tabletype = Type.GetType("Client");
database.CreateTable<tabletype>();
Type tabletype=Type.GetType(“客户机”);
CreateTable();
但是我得到一个错误,它说“找不到类型或名称空间名称'tabletype'。所有表都定义为同一命名空间中的类


谢谢。

你可以通过反射来完成

使用您的代码示例:

var database = GetDatabase(); // not sure what this type is.

MethodInfo method = database.GetType().GetMethod("CreateTable");
var assembly = Assembly.GetExecutingAssembly(); // Assume Class1, Class2 etc are here.

var tables = new string[] { "Class1","Class2" };

for(int i = 0; i < tables.Length; i++)
{
    MethodInfo generic = method.MakeGenericMethod(assembly.GetType(tables[i]););
    generic.Invoke(database, null);
}
var-database=GetDatabase();//不知道这是什么类型的。
MethodInfo method=database.GetType().GetMethod(“CreateTable”);
var assembly=assembly.getExecutionGassembly();//假设1班、2班等都在这里。
var tables=新字符串[]{“Class1”、“Class2”};
for(int i=0;i
首先,在调用
type.GetType时,您的类型名应该包括名称空间,并且类型的全名应该是无歧义的:

public Type GetTableType(string name) {
    const string NamespacePrefix = "MyApp.Tables.";
    return Type.GetType(NamespacePrefix + name);
}
当您拥有类型时,需要使用反射来调用泛型方法,因为在编译时无法确定类型:

string tableName = "BlaTable";
var genericMethodTemplate = database.GetType().GetMethod("CreateTable", new Type[0]);
//genericMethodTemplate can be seen as database.CreateTable<T>();
var tableType = GetTableType(tableName);
var genericMethod = genericMethodTemplate.MakeGenericMethod(tableType);
//now the T has been filled in with whatever table was given.
genericMethod.Invoke(database);
string tableName=“BlaTable”;
var genericMethodTemplate=database.GetType().GetMethod(“CreateTable”,新类型[0]);
//genericMethodTemplate可以看作是database.CreateTable();
var tableType=GetTableType(tableName);
var genericMethod=genericMethodTemplate.MakeGenericMethod(tableType);
//现在,T已经用给出的任何表格填充。
调用(数据库);

泛型类型参数必须是实际的类型名称。它们不能是计算为
类型
对象的表达式

SQLite Net已经有一个用于此情况的

Type tabletype = Type.GetType("Client");
database.CreateTable(tabletype);

string[]tables=new[]{“Class1”、“Class2”};
for(int i=0;i
在更一般的情况下,您必须将反射与
MakeGenericMethod
一起使用,以便使用来自表达式的类型调用该方法