我熟悉通过反射构造和调用泛型方法,但是由于某些原因,通过反射构造泛型委托会使我的大脑陷入困境!
也许是因为特别是委托不是最简单的。这不是一个专门针对MongoDb的问题,但是在我的情况下,我想做的是将一个类映射注册为一个根类,其中类型在类型变量中,因为我只是发现了它(没有输入一般而言)。 最终,我需要调用的方法如下:
BsonClassMap.RegisterClassMap<T>(Action<BsonClassMap<T>> classMapInitializer)
因此,在我要映射的类不是根类的情况下,我不需要传递委托,因此代码非常简单:
MethodInfo method = typeof(BsonClassMap).GetMethod("RegisterClassMap");
MethodInfo genericMethod = method.MakeGenericMethod(entityType);
genericMethod.Invoke(null, null);
我已经检查了诸如How can I dynamically create an Action<T> at runtime?之类的问题,并且了解发生了什么,但是由于某种原因,我的情况下嵌套的泛型使我无法自拔,我无法解决这个问题。 / p>
我正在尝试构造和调用与此等效的内容:
BsonClassMap.RegisterClassMap<T>(cm =>
{
cm.AutoMap();
cm.SetIsRootClass(true);
});
有人可以解释一下有关泛型委托创建的更多信息,尤其是在操作中的类型具有自己的泛型类型参数的情况下吗?一个与我正在尝试的示例类似的示例将是很棒的!
答案 0 :(得分:1)
您应该完全按照链接帖子中的答案进行操作。
首先,创建一个执行该操作的通用方法:
public static void Perform<T>(BsonClassMap<T> cm) {
cm.AutoMap();
cm.SetIsRootClass(true);
}
然后,获取Perform
的方法信息:
var performMethodInfo = typeof(YourType).GetMethod("Perform").MakeGenericMethod(entityType);
在其中创建一个代表Type
的{{1}},并在其中创建一个代表BsonClassMap<T>
的{{1}}:
Type
现在使用Action
:
var typeOfBsonClassMap = typeof(BsonClassMap<>).MakeGenericType(entityType);
var typeOfAction = typeof(Action<>).MakeGenericType(typeOfBsonClassMap);
然后您可以将其传递给方法:
Delegate.CreateDelegate