繁体   English   中英

公开接口方法名称

[英]Expose interface methods names

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

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

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

但是,我根本没有真正需要反思的地方。 您可以简单地传递一个委托:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM