使用反射创建通用委托

时间:2019-07-15 06:14:56

标签: c# mongodb reflection .net-standard

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

也许是因为特别是委托不是最简单的。这不是一个专门针对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);
    });

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

1 个答案:

答案 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