4

同様のコードを持つ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は私のオブジェクトではないため、共通のインターフェースを実装できません。または、それらが私のオブジェクトではない場合でも、それらを私のオブジェクトとして装飾することはできますか?

4

3 に答える 3

2

この場合、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);
}

それらが共通のインターフェースから継承しない場合は、継承することをお勧めします。

于 2013-03-08T16:29:55.233 に答える
0

私が感じているのは、4 つのメソッドがあり、それらが同じメソッド シグネチャを持っていない場合、完全に問題なく、常に汎用的である必要はなく、読みやすくする必要があるということです。

あなたLog(T1),Log(T2),Log(T3),Log(T4)がしなければならないのはLog(OneofTheTypeWhichYouKnowWhenCallingTheMethod).

あなたの場合のように、いつでも振り返って遊ぶことができると言いました。

于 2013-10-07T03:18:48.030 に答える