减少代码重复

时间:2014-07-25 08:05:44

标签: c# .net code-duplication

目前我有很多类(5)只有2个属性,但为不同的目的有不同的名称:

public class Class1
{
    public Class1()
    {

    }

    public string Id { get; set; }
    public string Value { get; set; }
}

public class Class2
{
    public Class2()
    {

    }

    public string Id { get; set; }
    public string Value { get; set; }
}


........

  public class Class5
 {
    public Class5()
    {

    }

    public string Id { get; set; }
    public string Value { get; set; }
}

然后我为每个类提供了一个返回List<Class>

的方法
 public static List<Class1> GetClass1()
    {
        Dictionary<string, string> s = GetSomeResults1();

        List<Class1> _s = new List<Class1>();

        foreach (var item in s)
        {
            Class1 c = new Class1();
            c.Id = item.Key;
            c.Value = item.Value;

            _s.Add(c);
        }

        return _s;
    }


  public static List<Class2> GetClass2()
    {
        Dictionary<string, string> s = GetSomeResults2();

        List<Class2> _s = new List<Class2>();

        foreach (var item in s)
        {
            Class2 c = new Class2();
            c.Id = item.Key;
            c.Value = item.Value;

            _s.Add(c);
        }

        return _s;
    }

  ......

   public static List<Class5> GetClass5()
    {
        Dictionary<string, string> s = GetSomeResults5();

        List<Class5> _s = new List<Class5>();

        foreach (var item in s)
        {
            Class5 c = new Class5();
            c.Id = item.Key;
            c.Value = item.Value;

            _s.Add(c);
        }

        return _s;
    }

有任何建议我怎样才能更好地制作此代码?

5 个答案:

答案 0 :(得分:11)

使用基类将共享属性和函数放在:

public class BaseClass
{
    public string Id { get; set; }
    public string Value { get; set; }

    // shared properties and methods
}

public class Class1 :  BaseClass
{
    // own properties and methods
}

public class Class2 :  BaseClass
{
    // own properties and methods
}

答案 1 :(得分:1)

我建议为

创建一个单独的类
public string Id { get; set; }
public string Value { get; set; }

并在课堂内打电话。

答案 2 :(得分:0)

您可以使用基类:

public abstract class BaseClass{
   public string Id { get; set; }
   public string Value { get; set; }
}
public class Class1 : BaseClass
{
    public Class1()
    {
    }
}

public class Class2: BaseClass
{
    public Class2()
    {
    }
}

现在你可以创建一个返回List<T>接口的泛型方法,其中T的类型为BaseClass

public static List<T> GetClass<T>(Func<Dictionary<string, string> func) where T : BaseClass, new()
{
    Dictionary<string, string> s = func();

    List<T> _s = new List<T>();

    foreach (var item in s)
    {
        T c = new T();
        c.Id = item.Key;
        c.Value = item.Value;

        _s.Add(c);
    }

    return _s;
}

然后致电:

List<Class2> class2list = GetClass<Class2>(GetSomeResults2);

答案 3 :(得分:0)

您可以使用类继承并将公共代码部分放到基类中,如下所示:

/// <summary>
/// Base class
/// </summary>
public class BaseClass
{
  public BaseClass()
  {
  }

  public string Id { get; set; }
  public string Value { get; set; }

  public virtual List<BaseClass> GetClass();

  protected List<TClass> GetList<TClass> (Dictionary<string, string> s) where TClass : BaseClass, new() {
    List<TClass> _s = new List<TClass>();

    foreach (var item in s)
    {
        TClass c = new TClass();
        c.Id = item.Key;
        c.Value = item.Value;

        _s.Add(c);
    }

    return _s;
  }
}

public class Class1 : BaseClass
  {
    public override List<Class1> GetClass() {
       Dictionary<string, string> s = GetSomeResults1();
       return GetList<Class1>(s);
  }
}

答案 4 :(得分:0)

Patrick Hofman的回答是正确的,但我还补充说,使用BaseClass可以减少使用类的代码量。

public static List<T> GetClassList() where T:BaseClass
{
    Dictionary<string, string> s = GetSomeResults<T>();

    List<T> _s = new List<T>();

    foreach (var item in s)
    {
        T c = new T();
        c.Id = item.Key;
        c.Value = item.Value;

        _s.Add(c);
    }

    return _s;
}

仅更改此功能是不够的,您还需要一种方法来实现GetSomeResults()方法。我真的不知道你的逻辑是什么样的,以及这些方法有多么不同,但是当这些方法完全不同时,这样的事情会有所帮助。

public static Dictionary<string, string> GetSomeResults<T>() where T : BaseClass
{
    if (T == typeof(Class1))
    {
        return GetSomeResults1();
    }
    else if (T == typeof(Class2))
    {
    //You got it..
    }
}