2011-01-18 11 views
1

私が何をしたいされています。今、私は手動で私のオブジェクトの各プロパティを変換する必要があり、新たなプロパティが追加されたとき、私は変換方法を行くことを覚えておく必要がありインターフェイスの派生型を変換する方法は?ここのために最も最も単純で

interface InterfaceA 
{ 
    string var1 { get; set; } 
    string var2 { get; set; } 
} 

public class DerivedA : InterfaceA 
{ 
    public string var1 { get; set; } 
    public string var2 { get; set; } 
} 

public class DerivedB : InterfaceA 
{ 
    public string var1 { get; set; } 
    public string var2 { get; set; } 
} 

public class DoEverything 
{ 
    InterfaceA A = new DerivedA(); 
    InterfaceA B = new DerivedB(); 

    A.var1 = "Test1"; 
    A.var2 = "Test2"; 

    B = ConvertObject<DerivedB>(A); 

    write(B.var1 + ", " + B.var2); 

    // This doesn't work, I would like it to though. 
    public T ConvertObject<T>(object obj) 
    { 
     T result = (T)typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { }); 

     foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties()) 
     { 
      if (propertyInfo.CanRead) 
      { 
       try 
       { 
        object value = propertyInfo.GetValue(obj, null); 
        propertyInfo.SetValue(result, value, null); 
       } 
       catch { } 
      } 
     } 

     return result; 
    } 
} 

それを追加します。私はこれが自動的に行われることを好むでしょう。

ご協力いただければ幸いです。

ありがとうございました

答えて

1

私はあなたが何を得ているのか分かりません。初期化のためにInterfaceAをとるDerivedAとDerivedBのコンストラクタを宣言するだけではどうですか?派生した各型は、インタフェース型から自身を初期化する責任があるため、よりシンプルで柔軟性があります。インターフェイスを実装するタイプを後で追加することができ、それ以上の変更なしに他のクラスで使用できるようになります。

+0

この理由は、私のビジネス層は、単に一般的なダミーのクラスを持っていますインターフェイスの各プロパティを取得および設定します。私の実際のクラスはビジネスレイヤーからアクセスできない。私は実際のクラスをシリアル化し、計算のためにWebサービスに送る必要があります。私はインターフェイスをシリアル化することはできませんし、元のクラスは私のビジネスレイヤーに実装されていませんが、私を挫折させる理由から私は制御できません。だから、元のクラスをダミークラスに変換してからシリアル化する必要があります。インターフェイスタイプを取るコンストラクタを追加することは、私が簡単に...できるので役に立ちません。 – ClaytonHunt

+0

クラスをDerivedB B = new DerivedB(){blah = A.blah、etc ...}として宣言してください。 AからBへ – ClaytonHunt

+0

既知のインターフェイスで作業しているので、これは簡単な答えです。あなたのダミークラスは、FromAメソッドとToAメソッドを実装しています。そのうちのeaxhは、InterfaceAを単一の引数として取ります。 FromAはargからプロパティ値を取得し、ToAはその逆を行います。 InterfaceAが何であるか知っていれば、リフレクションは必要ありません。 –

2

InterfaceAを引数として取るコンストラクタをDerivedBに追加することができます。

など。

public class DerivedB : InterfaceA 
{ 
    public string var1 { get; set; } 
    public string var2 { get; set; } 
    public DerivedB(InterfaceA original) 
    { 
     var1 = original.var1; 
     var2 = original.var2; 
    } 
} 

は、その後、あなたがそのように使用することができます。

public class DoEverything 
{ 
    InterfaceA A = new DerivedA(); 

    A.var1 = "Test1"; 
    A.var2 = "Test2"; 

    InterfaceA B = new DerivedB(A); 
    write(B.var1 + ", " + B.var2); 
} 
+0

それでも、すべての派生クラスをコンストラクタで更新してそれを処理する責任が私に残っています。そして、派生クラスごとにコンストラクタに追加することを忘れないでください。 – ClaytonHunt

+0

"Create"メソッドを含む抽象基本クラスを作成し、それを(DoEverythingまたはコンストラクタから)呼び出すことができます。いずれの場合でも、必ずしもすべてではなく、可能な「変換」クラスにコンストラクタを作成するだけで済みます。 – Sklivvz

+0

誰かがより効率的な方法で私を助けることができない場合、これはおそらく私が取らなければならないルートです。私はそれが問題だが、 – ClaytonHunt

0

をあなたは両方の派生クラスのためにoperator overloadingを実装する必要があります。

+0

ありがとう、もう一度、私はインターフェイスを変更してより多くのプロパティを含めるたびにメソッドを変更する必要があります。私は本当にこれを、すべてのインターフェースのすべての派生クラスに使用できるワンショット・キル・メソッドにしたいと考えています。彼らは同じ祖先を共有していた限り。明らかに、クラスCatをクラストースターに変換することはできません。 – ClaytonHunt

+0

@ user580270:反射を使うべきですが、それはむしろ遅く、とにかく - 悪い考えです – abatishchev

+0

もし私がリフレクションを選ぶなら、どうすれば実装できますか? – ClaytonHunt

関連する問題