2016-04-11 18 views
1
public DerivedClass : BaseClass 
{ 
    // code 
} 

DerivedClass B = (DerivedClass)MethodReturnsBaseClassObject(); 
B.DoWork(); 

BaseClassから継承された派生クラスが多数あります。だから毎回私はいくつかのプロパティを使うための新しいメソッドを書く必要があります。クラスの型Cを基底クラスに動的にキャストします。

これは、反射を使用してDerivedClassタイプのダイナミックを作成し、このようなことをして一般的にすることです。

System.Type type = GetRequestFromSession().GetType(); 
type B = (type)MethodReturnsBaseClassObject(); 
Console.WriteLine(B.Name); 
Console.WriteLine(B.Age); 

何か助けていただければ幸いです。

+0

動的な種類を検討しましたか:https://msdn.microsoft.com/en-us/library/dd264736.aspxまたはExpandoObject https://msdn.microsoft.com/en-us/library/system.dynamic。 expandoobject(v = vs.110).aspx?この件に関するmsdnのブログもあります:https://blogs.msdn.microsoft.com/csharpfaq/2009/09/30/dynamic-in-c-4-0-introducing-the-expandoobject/ –

+0

'Name'と' Age'を 'BaseClass'に宣言することはできません。 – HimBromBeere

答えて

3

これは私にとって悪いデザインのように感じます。あなたは、あなたが使用していないものを一般的なものにします。たぶんあなたはあなたのデザインを考え直すべきでしょう。

あなたの質問には、おそらく、あなたが期待するタイプを返すプロキシメソッドまたはクラスを作成することができます。これは、呼び出したメソッドの数が少ない場合にのみ便利です。

もう1つの選択肢はdynamicキーワードを使用することですが、他に何も働かない場合は、それを使用するようにアドバイスします。

+0

私は非常に悪いデザインを知っています。しかし、私はそれを一般的にする必要があります。すべてのアプリケーションで書かれた34の同じメソッドがあります。私は将来のより良いメンテナンスのための1つの方法を作りたいです –

+0

ありがとうパトリック。このデザインでダイナミックを使用すると修正されました...しかし、申し訳ありませんが、私はこのアプリケーションで新たに取り組んでいます。 –

4

次のシグネチャを使用して、一般的な方法を採用する場合は、基本クラスの制約を強制しながら、あなたは(キャストなし)派生型のメンバへの安全なアクセスを持つことができます。

public TDerived MethodReturnsDerivedObject<TDerived>() 
    where TDerived : BaseClass 

あなたの呼び出しは、このようになります。 :

DerivedClass b = MethodReturnsDerivedObject<DerviedClass>(); 

b.ExecuteSomeMethodDefinedInBaseClass(); 

Console.WriteLine(b.SomePropertyDefinedInDerivedClass); 
+0

これは動的IMOを使用するよりも優れています。 – moarboilerplate

+0

ええ、ジェネリック薬を使ったこのようなものが行く方法でしょう。 – Magnus

+0

これは多くの派生型の共通実装です。私はダイナミックを使用したので、私は自分のデザインを変更する必要はありません。しかし、これのためには、まず、派生クラスの型を知る必要があります。 –

2

私は今、Kirill Shlenskiyの答えに行きます。しかし、私はまた、このメソッドを基底クラスに移動することをお勧めしたいと思います。。このソリューションを禁止する依存関係やその他の奇妙なものがあるかもしれませんが、ジェネリックを使わずに1人の消費者を持つこともできます。

関連する問題