C# 公开接口方法名称
我使用的方法是使用反射调用类方法,并从spring获取服务对象类。大概是这样的: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
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
实现中检查方法
参数。如您所见,它只需要您想要在其上执行方法的类型。所有其他内容都包含在代表中。再次感谢。我做了一些测试,但是按照我的代码和类的结构,这种方式(委托和操作)不起作用。