1

我熟悉通过反射构造和调用泛型方法,但由于某种原因,通过反射构造泛型委托让我的大脑陷入困境!

也许是因为委托特别不是最简单的。这不是一个专门的 MongoDb 问题,但在我的情况下,我想要做的是将一个类映射注册为一个根类,其中类型在一个类型变量中,因为我刚刚发现它(没有输入一般)。最终,我需要调用的方法如下所示:

    BsonClassMap.RegisterClassMap<T>(Action<BsonClassMap<T>> classMapInitializer)

所以在我映射的类不是根类的情况下,我不需要传递委托,所以代码非常简单:

    MethodInfo method = typeof(BsonClassMap).GetMethod("RegisterClassMap");
    MethodInfo genericMethod = method.MakeGenericMethod(entityType);
    genericMethod.Invoke(null, null);

我已经检查了诸如如何在运行时动态创建 Action<T> 之类的问题?我明白那里发生了什么,但由于某种原因,我的情况下的嵌套泛型让我失望,我无法绕过它。

我正在尝试构建和调用与此等效的内容:

    BsonClassMap.RegisterClassMap<T>(cm =>
    {
        cm.AutoMap();
        cm.SetIsRootClass(true);
    });

有人可以解释一下有关泛型委托创建的更多信息,特别是在操作中的类型具有自己的泛型类型参数的情况下吗?一个类似于我正在尝试做的例子会很棒!

4

1 回答 1

1

您应该完全按照链接帖子中的答案进行操作。

首先,创建一个通用方法来做这件事:

public static void Perform<T>(BsonClassMap<T> cm) {
    cm.AutoMap();
    cm.SetIsRootClass(true);
}

然后,获取方法信息Perform

var performMethodInfo = typeof(YourType).GetMethod("Perform").MakeGenericMethod(entityType);

创建一个Type表示BsonClassMap<T>并从中创建一个Type表示Action

var typeOfBsonClassMap = typeof(BsonClassMap<>).MakeGenericType(entityType);
var typeOfAction = typeof(Action<>).MakeGenericType(typeOfBsonClassMap);

现在使用Delegate.CreateDelegate

var del = Delegate.CreateDelegate(typeOfAction, performMethodInfo);

然后你可以将它传递给方法:

genericMethod.Invoke(null, new object[] { del });
于 2019-07-15T06:50:30.063 回答