我有一系列接受要运行的类型的通用方法。例如:
db.CreateTable<MyClassName>();
我希望能够创建一个类列表,然后像这样遍历该列表:
foreach(var class in classList)
{
db.CreateTable<class>();
db.CheckStatus<class>();
// ... etc
}
VS表示参数为method group
。我用谷歌搜索,文档说这是一个委托。如何创建指向我的类的委托人列表,然后可以对其进行迭代并用作对泛型方法的引用?
答案 0 :(得分:3)
我的答案做了一个假设,我刚刚意识到可能是无效的:我假设classList
是IEnumerable<Type>
。如果那是不正确的,我的答案将需要修改。
它必须像这样。
var fn = db.GetType().GetMethod("CheckStatus");
foreach (var cls in classList)
{
var fn2 = fn.MakeGenericMethod(cls);
fn2.Invoke(db, null);
}
好的,这是怎么回事。我们获得了db
对象上称为“ CheckStatus”的方法的引用。如果该方法有重载,则需要使用GetMethod
的重载之一来获取它。
然后,将其设为封闭的泛型方法。因此,在第一部分中,我们获得了方法CheckStatus<T>
,其中未指定T
。这是 open 泛型。您需要使用您的类型信息填写通用名称。 MakeGenericMethod
就是这样做的。实际上,它给您CheckStatus<cls>
。然后,您可以在db
上调用此方法。
有关打开/关闭的泛型的更多信息,请参见:What exactly is an “open generic type” in .NET?