snippetcsharpMinor
How do I simplify the code in C#?
Viewed 0 times
codesimplifythehow
Problem
Here is a code I want to simplify:
There are 3 methods. I've been thinking about how I could simplify them using delegates or lambdas and didn't find anything.
Note that ApiCall1/2/3 are all defined in a third-party library.
Your thoughts?
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;
}
}There are 3 methods. I've been thinking about how I could simplify them using delegates or lambdas and didn't find anything.
Note that ApiCall1/2/3 are all defined in a third-party library.
Your thoughts?
Solution
Alright, let's see if we can simplifyabstract this for you. I'm not going to say simplify because often times abstracting something is far from simplifying it.
I think you can turn the method into something like this:
... then you should be able to call it like this:
... one caveat is
I think you can turn the method into something like this:
public void Method(Context context, Action body, EventLog log = null)
{
Class myClass = ConvertToMyClass();
T apiCall = Activator.CreateInstance(typeof(T), new [] { context });
if (log != null)
{
eventLog.WriteEntry("Starting");
}
try
{
body(apiCall, class);
IsCallSuccess = true;
}
catch (Exception e)
{
if (log != null)
{
eventLog.WriteEntry("error");
}
IsCallSuccess = false;
CallErrorMessage = e.Message;
}
}... then you should be able to call it like this:
// Method1
Method(
yourContextInstance,
(apiCall, myClass) =>
{
apiCall.Call1(myClass, null, false);
},
yourLogInstance);
// Method2
Method(
yourContextInstance,
(apiCall, myClass) =>
{
apiCall.Call1(myClass);
NewItemID = myClass.ItemID;
},
yourLogInstance);
// Method3
Method(
yourContextInstance,
(apiCall, myClass) =>
{
apiCall.Call3(myClass, "param1");
UpdatedItemID = myClass.UpdatedItemID;
},
yourLogInstance);... one caveat is
NewItemID and UpdatedItemID. If you're not making these calls from inside the class Method is defined in, you may need to modify this a tad to get the Method to return and integer instead.Code Snippets
public void Method<T>(Context context, Action<T, Class> body, EventLog log = null)
{
Class myClass = ConvertToMyClass();
T apiCall = Activator.CreateInstance(typeof(T), new [] { context });
if (log != null)
{
eventLog.WriteEntry("Starting");
}
try
{
body(apiCall, class);
IsCallSuccess = true;
}
catch (Exception e)
{
if (log != null)
{
eventLog.WriteEntry("error");
}
IsCallSuccess = false;
CallErrorMessage = e.Message;
}
}// Method1
Method<ApiCall1>(
yourContextInstance,
(apiCall, myClass) =>
{
apiCall.Call1(myClass, null, false);
},
yourLogInstance);
// Method2
Method<ApiCall2>(
yourContextInstance,
(apiCall, myClass) =>
{
apiCall.Call1(myClass);
NewItemID = myClass.ItemID;
},
yourLogInstance);
// Method3
Method<ApiCall3>(
yourContextInstance,
(apiCall, myClass) =>
{
apiCall.Call3(myClass, "param1");
UpdatedItemID = myClass.UpdatedItemID;
},
yourLogInstance);Context
StackExchange Code Review Q#17911, answer score: 4
Revisions (0)
No revisions yet.