如何将两个相似的函数变成一个函数

本文关键字:函数 一个 两个 相似 | 更新日期: 2023-09-27 18:35:19

我有两个函数,在两个不同的类上做基本相同的事情......每个类都有不同的属性。

例如:

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();
}

但是我将如何处理每个属性

如何将两个相似的函数变成一个函数

与其使用泛型,为什么不使用继承来解决这个问题呢?

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();
}

如果可以更改类的定义,则最好的方法是使它们实现包含要访问的属性的通用接口:

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 个类实现具有该功能的相同接口,否则您无能为力。在您的情况下,甚至函数签名也不同。

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

看看 Reflection。

反射会让你的代码收到一个ClassA,并发现它有一个ColourID和一个ColorDescription。同样,当您收到 ClassB ,您可以发现它的TypeIDTypeDescription 。很酷。

我可能会推荐一个通用接口,至少对于您的示例,但是如果您正在尝试更复杂和更通用的东西,那么 Reflection 是要走的路。