公开接口方法名称

时间:2013-09-06 12:49:55

标签: 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.GetType();
        MethodInfo method = classType.GetMethod(methodName);
        method.Invoke(service, arguments);
    }


//...

InvokeMethod(SpringObjectsConstants.LogDocumentService, "SetDocumentStatus", 9127, LogDocumentPendingStatusEnum.Finalized)

我需要将方法名称作为字符串通知,因此该方法可以调用它,但我不想使用字符串,因为如果方法名称更改,我无法跟踪它的用法。 有什么方法可以使用看起来像枚举的接口方法吗?任何可能导致编译错误的东西,或者我可以更新在visual studio中重命名方法名称?

1 个答案:

答案 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);
}