我正在使用一个方法,该方法使用反射调用类方法并从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)
我需要将方法名称作为字符串通知,因此该方法可以调用它,但我不想使用字符串,因为如果方法名称更改,我无法跟踪它的用法。 有什么方法可以使用看起来像枚举的接口方法吗?任何可能导致编译错误的东西,或者我可以更新在visual studio中重命名方法名称?
答案 0 :(得分:0)
有一种重构安全的方法:您可以使用表达式并解析它。这个想法与this article中的想法相同 不幸的是,当您使用方法而不是属性时,它会变得有点混乱,因为您需要将参数传递给方法。
话虽如此,有一个更优雅的解决方案。它只是使用代理
但是,我根本不认为需要反思。您只需传递一个代理:
InvokeMethod<ServiceImpl>(
SpringObjectsConstants.LogDocumentService,
x => x.SetDocumentStatus(9127, LogDocumentPendingStatusEnum.Finalized));
这将有另一个好处:如果您更改了参数的类型或从方法中添加或删除了参数,您还会收到编译错误。
InvokeMethod
看起来像这样:
private void InvokeMethod<TService>(
string serviceName, Action<TService> method)
{
TService service = (TService)SpringContextManager.Instance
.GetObject(serviceName);
method(serviceName);
}