0

2つの異なるクラスで基本的に同じことを行う2つの関数があります。各クラスには異なるプロパティがあります。

例えば:

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を1つの関数にして、同様の構造を持つすべてのクラスにこれを使用できるようにする方法はありますか?

私は私が次のようなある種の一般的なことをすることができることを知っています

public void ExFunctionSave<T>()   // T is either ClassA or ClassB
{
   .
   .
   .
   .
   Save();
}

しかし、それぞれのプロパティをどのように処理しますか

4

5 に答える 5

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();
}
于 2012-05-25T21:12:50.040 に答える
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();
}
于 2012-05-25T21:12:45.537 に答える
0

リフレクションを見てください。

リフレクションにより、コードは を受け取りClassA、 と があることColourIDがわかりますColorDescription。同様に、 を受け取ると、そのとClassBを発見できます。かっこいいね。TypeIDTypeDescription

少なくともあなたの例では、おそらく共通のインターフェースをお勧めしますが、より複雑でより一般的なものをしようとしている場合は、リフレクションが最適です。

于 2012-05-25T21:20:49.680 に答える
0

2つのクラスが関数を持つ同じインターフェースを実装しない限り、これ以上何もできません。あなたの場合、関数のシグネチャでさえ異なります。

于 2012-05-25T21:10:32.763 に答える
0

属性 id と description を使用して Interface を定義できます。この構造を持つクラスは、そのインターフェイスを実装できます。そして、あなたのメソッドはパラメータとしてインターフェイスを受け取り、メソッドを実行します...

于 2012-05-25T21:12:18.173 に答える