Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 公开接口方法名称_C#_Spring_Reflection_System.reflection - Fatal编程技术网

C# 公开接口方法名称

C# 公开接口方法名称,c#,spring,reflection,system.reflection,C#,Spring,Reflection,System.reflection,我使用的方法是使用反射调用类方法,并从spring获取服务对象类。大概是这样的: private void InvokeMethod(string serviceName, string methodName, params object[] arguments) { object service = SpringContextManager.Instance.GetObject(serviceName); Type classType = service

我使用的方法是使用反射调用类方法,并从spring获取服务对象类。大概是这样的:

private void InvokeMethod(string serviceName, string methodName, params object[] arguments)
    {
        object service = SpringContextManager.Instance.GetObject(serviceName);
        Type classType = service.GetType();
        MethodInfo method = classType.GetMethod(methodName);
        method.Invoke(service, arguments);
    }


//...

InvokeMethod(SpringObjectsConstants.LogDocumentService, "SetDocumentStatus", 9127, LogDocumentPendingStatusEnum.Finalized)
private void InvokeMethod<TService>(
    string serviceName, Action<TService> method)
{
    TService service = (TService)SpringContextManager.Instance
                                                     .GetObject(serviceName);
    method(serviceName);
}
我需要以字符串的形式通知方法名,以便方法可以调用它,但我不想使用字符串,因为如果方法名更改,我无法跟踪它的用法。
有什么方法可以使用看起来像枚举之类的接口方法吗?任何可能导致编译错误的内容,或者我可以在visual studio中更新重命名方法名称?

有一种重构安全的方法:可以使用表达式并解析它。想法与中相同。
不幸的是,当您使用方法而不是属性时,它会变得有点混乱,因为您需要将参数传递给方法

话虽如此,还有一个更优雅的解决方案。它只使用一个委托

然而,我真的不认为有必要在这里进行反思。您只需传递一个委托:

InvokeMethod<ServiceImpl>(
    SpringObjectsConstants.LogDocumentService,
    x => x.SetDocumentStatus(9127, LogDocumentPendingStatusEnum.Finalized));

谢谢你的回复。为了改进我的描述,出于某些原因,我需要构建一个要调用的“命令”列表。当我的进程结束时,我需要在同一个DB事务作用域中调用列表中的所有命令,以便在出现错误时保证回滚所有命令。这就是我需要存储命令的原因。在这种情况下,委托是最好的方式吗?“我的服务方法有不同的签名。@Rafael:不确定您的评论,但您可以轻松地存储一个委托。不同的签名不是问题。在我的
InvokeMethod
实现中检查
方法
参数。如您所见,它只需要您想要在其上执行方法的类型。所有其他内容都包含在代表中。再次感谢。我做了一些测试,但是按照我的代码和类的结构,这种方式(委托和操作)不起作用。