使用Template方法代替重复的代码
本文关键字:代码 Template 方法 使用 | 更新日期: 2023-09-27 18:02:53
我有4个方法有相似的代码
private void LogExceptions(ObjA.Input input, int customerId)
{
//ObjA is a big object, thats why I try not to send the whole object in this method
Log(input);
Log(ObjA.Exceptions);
}
private void LogExceptions(ObjB.Input input, int customerId)
{
//ObjB is a big object, thats why I try not to send the whole object in this method
Log(input);
Log(ObjB.Exceptions);
}
等等
我不能使它成为一个模板方法,如
private void LogExceptions<T1,T2>(T1 input, int customerId) whereas T1:ObjA.Input,ObjB.Input
{
Log(T1);
Log(T2);
}
怎么做还是有其他方法?如有任何帮助,不胜感激。
我不认为我的问题有助于得到正确的答案....下面是确切的代码....
private void LogExceptions(AccARef.Response response)
{
StringBuilder sbErrors = null;
if (response.ValMethod != null && response.ValMethod.IsValid == false)
{
if (response.ValMethod.Errors.Count() > 0)
{
sbErrors = new StringBuilder();
foreach (AccARef.Exception exp in response.ValMethod.Errors)
{
sbErrors.Append(" * " + exp.Message + exp.StackTrace + " ");
Console.WriteLine(strError.ToString())
}
}
}
}
private void LogExceptions(AccBRef.Response response)
{
StringBuilder sbErrors = null;
if (response.ValMethod != null && response.ValMethod.IsValid == false)
{
if (response.ValMethod.Errors.Count() > 0)
{
sbErrors = new StringBuilder();
foreach (AccBRef.Exception exp in response.ValMethod.Errors)
{
sbErrors.Append(" * " + exp.Message + exp.StackTrace + " ");
Console.WriteLine(strError.ToString())
}
}
}
}
现在AcctBRef和AcctARef不能实现一个共同的接口,因为它们不是我的对象。或者如果它们不是我的对象,我还能把它们装饰成我的吗?
在这种情况下,如果ObjA和ObjB从相同的基类或接口继承,甚至不需要泛型。
如果你有
interface IBaseClass
{
IEnumerable<Something> Exceptions {get;set;}
InputType Input {get;set;}
}
class A : IBaseClass {}
class B : IBaseClass {}
你可以用这个作为你的LogExceptions签名:
void LogExceptions(IBaseClass obj, int CustomerId)
{
Log(obj.Exceptions);
Log(obj.Input);
}
如果它们没有从公共接口继承,那么我建议它们应该继承。
不能将类型参数传递给日志方法。你必须传递一个Type参数的实例。
试试以下:
private void LogExceptions<T1, T2>(T1 input, T2 exceptions, int customerId)
{
Log(input);
Log(exceptions);
}
我觉得如果有4个方法,它们没有相同的方法签名是完全可以的,它不必总是通用的,它必须是可读的。
如果你要做的是Log(OneofTheTypeWhichYouKnowWhenCallingTheMethod)
,为什么你要打4个Log(T1),Log(T2),Log(T3),Log(T4)
呢?
我已经说过了,你总是可以像在你的例子中那样使用反射。