使用 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 方法上实现的。
我正在尝试使用反射来自动化方法存储库。
比如我有一个方法
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 方法上实现的。