向大家致以问候!
我在C#中有一些非常类似的方法(可能会有几十个)。它们都基于几乎相同的模式:
ResultObjectType MethodX(...input parameters of various types...)
{
nesting preparation code here...
{
{
resultObject = ExternalClass.GetResultForMethodX(input parameters of MethodX);
}
}
nesting result processing code here ...
return resultObject;
}
重复/相同部分: ResultObjectType,准备代码,结果处理代码。
不同部分:要调用的ExternalClass方法,输入参数集(输入参数的数量,类型)。
重要提示:我无法控制方法签名 - 无法更改它们。
我试图避免使用类似的代码重复所有类似代码的块:
ResultObjectType MethodX(...input parameters of various types...)
{
return UniversalMethod(
new ExternalMethodDelegate(ExternalClass.GetResultForMethodX),
input parameters of MethodX...);
}
ResultObjectType UniversalMethod (Delegate d, input parameters of various types...)
{
nesting preparation code...
{
{
resultObject =
(d as ExternalMethodDelegate)(same input parameters as above);
}
}
nesting result processing code...
return resultObject;
}
到目前为止,我只是设法让它以这种方式工作,以防所有参数在编码时具有相同的已知类型。经过多次尝试用通用代表解决这个问题后,我开始认为这是不可能实现的。即使我的代码编译,它也无法在运行时运行。任何接受者?在此先感谢您的帮助!
答案 0 :(得分:2)
以下是使用泛型委托的示例:
int MethodY(int something, int other)
{
return UniversalMethod(() => GetResultForMethodY(something, other));
}
string MethodX(string something)
{
return UniversalMethod(() => GetResultForMethodX(something));
}
T UniversalMethod<T>(Func<T> fetcher)
{
T resultObject;
//nesting preparation code here...
{
resultObject = fetcher();
}
//nesting result processing code here ...
return resultObject;
}
如果ResultObjectType始终相同,则可以删除所有T
。
答案 1 :(得分:0)
重复/相同的部分:ResultObjectType,准备代码,结果处理代码。
您应该集中精力使这些部件尽可能隔离。
另一种方法是代码生成。