如何将两个相似的函数合并为一个函数?

时间:2012-05-25 21:06:22

标签: c# .net

我有两个函数在两个不同的类上执行基本相同的操作....每个类都有不同的属性。

例如:

public class ClassA
{
    public int ColorID {get;set;}
    public string ColorDescription {get;set;}
}

public class ClassB
{
    public int TypeID {get;set;}
    public string TypeDescription {get;set;}
}

public void ExFunctionSaveA(ClassA aClass)    
{
  aClass.ColorID=1;
  aClass.ColorDescription="My Color";
  Save();
}

public void ExFunctionSaveB(ClassB bClass)    
{
  bClass.TypeID=2;
  bClass.TypeDescription="My Type";
  Save();
}

正如您所看到的,类和函数具有相同的类型结构,只是属性名称不同......但我觉得我正在重复执行代码

有没有办法将ExFunctionA和ExFunctionB组合成一个函数,这样我就可以将它用于所有具有类似结构的类

我知道我可以做一些像

这样的通用的东西
public void ExFunctionSave<T>()   // T is either ClassA or ClassB
{
   .
   .
   .
   .
   Save();
}

但我如何处理每个

的属性

5 个答案:

答案 0 :(得分:5)

为什么不使用继承来解决这个问题,而不是使用泛型?

public class theBase
{
    string ID;
    string Description;
}
public class theColor : theBase
{
}

public class theType : theBase
{
}

public void ExFunctionSaveA(theBase base)    
{
    base.ID=1;
    base.Description="My Color";
    Save();
}

答案 1 :(得分:2)

如果你可以改变你的类的定义,那么最好的方法是让它们实现一个包含你想要访问的属性的通用接口:

public interface IDescribable
{
    int ID { get; set; }
    string Description { get; set; }
}

public class ClassA
{
    public int ID { get; set; }
    public string Description { get; set; }

    public int ColorID 
    { 
        get { return ID; } 
        set { ID = value; } 
    }

    public string ColorDescription 
    { 
        get { return Description; } 
        set { Description = value; } 
    }
}

public class ClassB
{
    public int ID { get; set; }
    public string Description { get; set; }

    public int TypeID 
    { 
        get { return ID; } 
        set { ID = value; } 
    }

    public string TypeDescription 
    { 
        get { return Description; } 
        set { Description = value; } 
    }
}

public void ExFunctionSave(IDescribable d, int id, string desc)    
{
    d.ID = id;
    d.Description = desc;
    Save();
}

答案 2 :(得分:0)

除非2个类实现具有该功能的相同接口,否则您无法做到。在您的情况下,即使功能签名也不同。

答案 3 :(得分:0)

您可以使用属性id和description定义接口。 具有此结构的clases可以实现该接口。 并且您的方法接收接口作为参数并执行moethods ...

答案 4 :(得分:0)

看看Reflection

反思会让您的代码收到ClassA,并发现它有ColourIDColorDescription。同样,当您收到ClassB时,您可以发现其TypeIDTypeDescription。这很酷。

我可能会推荐一个通用的界面,至少在你的例子中,但是如果你想尝试更复杂和更通用的东西,那么反射就是你的选择。