使用Template方法代替重复的代码

时间:2013-03-08 16:21:33

标签: c# templates generics reusability

我有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无法实现通用接口,因为它们不是我的对象。或者,如果它们不是我的对象,我还可以将它们装饰成我的吗?

3 个答案:

答案 0 :(得分:2)

如果ObjA和ObjB继承自相同的基础blass或接口,你甚至不需要泛型。

如果你有

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

如果他们从公共接口继承,那么我建议他们应该。

答案 1 :(得分:0)

您无法将Type参数传递给Log方法。您必须传递Type参数的实例。

尝试以下:

 private void LogExceptions<T1, T2>(T1 input, T2 exceptions, int customerId) 
    {
        Log(input);
        Log(exceptions);
    }

答案 2 :(得分:0)

我觉得如果有4种方法并且它们没有完全相同的方法签名,那么它并不总是必须是通用的,它也必须是可读的。

如果你所要做的只是Log(T1),Log(T2),Log(T3),Log(T4),为什么要拨打4个电话Log(OneofTheTypeWhichYouKnowWhenCallingTheMethod)

说过你可以像你的情况一样反复玩耍。