2

簡単にしたいコードは次のとおりです。

       public void Method1(Context context, EventLog log = null)
        {
            Class myClass = ConvertToMyClass();
            ApiCall1 apiCall = new ApiCall1(context);
            if (log != null)
            {
                eventLog.WriteEntry("Starting");
            }

            try
            {
                apiCall.Call1(myClass, null, false);
                IsCallSuccess = true;
            }
            catch (Exception e)
            {
                if (log != null)
                {
                    eventLog.WriteEntry("error");
                }

                IsCallSuccess= false;
                CallErrorMessage = e.Message;
            }
        }

        public void Method2(Context context, EventLog log = null)
        {
            Class myClass = ConvertToMyClass();
            ApiCall2 apiCall = new ApiCall2(context);
            if (log != null)
            {
                eventLog.WriteEntry("Starting");
            }

            try
            {
                apiCall.Call1(myClass);
                NewItemID = myClass.ItemID;
                IsCallSuccess = true;
            }
            catch (Exception e)
            {
                if (log != null)
                {
                    eventLog.WriteEntry("error");
                }

                IsCallSuccess= false;
                CallErrorMessage = e.Message;
            }
        }

        public void Method3Context context, EventLog log = null)
        {
            Class myClass = ConvertToMyClass();
            ApiCall3 apiCall = new ApiCall3(context);
            if (log != null)
            {
                eventLog.WriteEntry("Starting");
            }

            try
            {
                apiCall.Call3(myClass, "param1");
                UpdatedItemID = myClass.UpdatedItemID;
                IsCallSuccess = true;
            }
            catch (Exception e)
            {
                if (log != null)
                {
                    eventLog.WriteEntry("error");
                }

                IsCallSuccess= false;
                CallErrorMessage = e.Message;
            }
        }

3つの方法があります。デリゲートまたはラムダを使用してそれらを単純化する方法を考えていましたが、何も見つかりませんでした。

あなたの考え?

4

1 に答える 1

1

ふたつのやり方...

1) メソッドをジェネリックにします。3 つすべてが影響するクラスだけが異なるためです。これは次のようになります。

public void Method<T>(Context context, EventLog log = null) where T : BaseAPICall
{
    Class myClass = ConvertToMyClass();
    T apiCall = (T)Activator.CreateInstance(typeof(T), new object[] { context });
    if (log != null)
    {
        eventLog.WriteEntry("Starting");
    }

    try
    {
        apiCall.Call(myClass, null, false);
        IsCallSuccess = true;
    }
    catch (Exception e)
    {
        if (log != null)
        {
            eventLog.WriteEntry("error");
        }

        IsCallSuccess= false;
        CallErrorMessage = e.Message;
    }
}

また

2) これらのメソッドを適切なクラスの親クラスに配置します。この場合、それは ApiCall1/2/3 の親クラスになります。次のようになります。

public class BaseAPICall
{
    public abstract Call(Class c, object o, bool b);

    public virtual Method(Context context, EventLog log = null)
    {
        Class myClass = ConvertToMyClass();
        if (log != null)
        {
            eventLog.WriteEntry("Starting");
        }

        try
        {
            this.Call(myClass, null, false);
            IsCallSuccess = true;
        }
        catch (Exception e)
        {
            if (log != null)
            {
                eventLog.WriteEntry("error");
            }

            IsCallSuccess = false;
            CallErrorMessage = e.Message;
        }
    }
}
于 2012-10-25T06:21:55.553 に答える