0

我正在研究一种使用反射调用类方法并从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 中的方法名称?

4

1 回答 1

0

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

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

但是,我根本不认为需要反思。您可以简单地传递一个委托:

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);
}
于 2013-09-06T12:58:28.993 回答