如何消除重复的代码

Ken*_*ter 2 c# oop

我有以下方法,都返回不同的类型.我有四种这样的方法.本着良好编程实践(DRY)的精神,应该在这里使用一些OOP技术,例如继承或接口,或者只是使用它.欢迎任何评论或代码示例.谢谢.

  static AttendeeResponse GetAttendees(HttpWebRequest request)
    {
        HttpWebResponse resp = (HttpWebResponse)request.GetResponse();

        try
        {
            XmlSerializer ser = new XmlSerializer(typeof(AttendeeResponse));
            return (AttendeeResponse)ser.Deserialize(resp.GetResponseStream());
         }
        catch(Exception e)
        {
            error =  e.InnerException.ToString();
            return null;
        }

    }

    static MemberResponse GetMembers(HttpWebRequest request)
    {
        HttpWebResponse resp = (HttpWebResponse)request.GetResponse();

        try
        {
            XmlSerializer ser = new XmlSerializer(typeof(MemberResponse));
            return (MemberResponse)ser.Deserialize(resp.GetResponseStream());
        }
        catch (Exception e)
        {
            error = e.InnerException.ToString();
            return null;
        }

    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 13

怎么样:

// TODO: Improve the name :)
static T FetchItem<T>(HttpWebRequest request)
{
    using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
    {
        try
        {
            XmlSerializer ser = new XmlSerializer(typeof(T));
            return (T) ser.Deserialize(resp.GetResponseStream());
        }
        catch (Exception e)
        {
            error = e.InnerException.ToString();
            return default(T);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已经包含了一个using法规,以避免泄漏连接.根据文档,您也不需要关闭流.

return null不得不改变到return default(T)的情况下T是一个非空值类型; 另一种方法是T使用where T : class作为方法声明的一部分来限制为引用类型.

像这样使用它:

MemberResponse members = FetchItem<MemberResponse>(request);
...
AttendeeResponse attendee = FetchItem<AttendeeResponse>(request);
Run Code Online (Sandbox Code Playgroud)