使用 MethodInfo 创建 func<T,T>

Create func<T,T> using MethodInfo

我正在尝试使用反射来自动化方法存储库。

比如我有一个方法

public string CanCallThis(int moduleFunctionId)
{
    return "Hello";
}

我是这样在我的命令管理器中注册的。

commandManager.RegisterCommand(moduleName,"CanCallThis", new ModuleCommand<int, string>(CanCallThis));

这工作正常,但它是一个手动注册每个命令的过程。

我正在尝试使用反射,以便我可以探测 class 中的命令,然后使用反射发现的信息调用 RegistrCommand 方法 - 这将使生活变得更轻松,因为我没有记住添加每个 RegisterCommand 条目。

我正在创建注册该方法的方法,目前我的代码如下所示。

List<MethodInfo> methodInfos = IdentifyMethods();

foreach (var methodInfo in methodInfos)
{
    ParameterInfo[] methodParams = methodInfo.GetParameters();

    if (methodParams.Length = 1)
    {
        Type returnType = methodInfo.ReturnType;
        string methodName = methodInfo.Name;
        Type inputParam = methodParams[0].ParameterType;

        commandManager.RegisterCommand(moduleName, methodInfo.Name, new ModuleCommand<inputParam, returnType>(unknown));
    }
}

在上述示例中,inputParam、returnType 和 unknown 导致了编译错误。我的目标是创建 ModuleCommand 的实例。 我确定这与创建委托有关,但我不确定该怎么做。

有人可以帮我创建 ModuleCommand 吗?

找到解决方案,给大家。

List<MethodInfo> methodInfos = IdentifyMethods();

foreach (var methodInfo in methodInfos)
{
    ParameterInfo[] methodParams = methodInfo.GetParameters();

    if (methodParams.Length == 1)
    {
        Type returnType = methodInfo.ReturnType;
        string methodName = methodInfo.Name;
        Type inputParam = methodParams[0].ParameterType;

        Type genericFuncType = typeof(Func<,>).MakeGenericType(inputParam, returnType);
        Delegate methodDelegate = Delegate.CreateDelegate(genericFuncType, this, methodInfo);

        Type genericModuleCommandType = typeof(ModuleCommand<,>).MakeGenericType(inputParam, returnType);

        IModuleCommand o = (IModuleCommand)Activator.CreateInstance(genericModuleCommandType, methodDelegate);

        commandManager.RegisterCommand(moduleName, methodName, o);
    }
}

上面代码中的 IModuleCommand 是我为 ModuleCommand<,> 实现而创建的接口。这是在 Registercommand 方法上实现的。