2016-12-08 2 views
1

の背後に隠されたオブジェクトのプロパティの値を取得し、私は別のさまざまなオブジェクトを運ぶことができるインタフェース型のプロパティを持つオブジェクトを持っています。C#はより良いそれを説明するためのインタフェース

public class RequestParameters { 
    public IRequest Request { get; set; } 
} 

インターフェイスがこのようなものになります言ってやるがいい。RequestParametersオブジェクトを受信すると、今

public interface IRequest { 
    string Username { get; set; } 
    string Password { get; set; } 
} 

を、私は要求内部オブジェクトからPERSONIDプロパティの値を取得したいプロパティ。すべてのリクエストタイプにそのプロパティがあるわけではないため、インターフェイスにはこのプロパティが含まれていてはいけません。そして、私は数十種類のうちのどれが要求オブジェクトに対応するのかわからないので、キャスティングは解決策ではありません。

このような場合、どうすればプロパティーを取得できますか?PersonId私は何らかの反射が唯一の方法だと思いますが、どのように正確にそれを行うことができますか?

+1

すべてのタイプの「IRequest」のIDが必要かどうかを再考する必要があります。インタフェースからの目的は、機能を共通のものに整理することです。だから、あなたがこの*ものに収まらない財産を持っているときは、あなたはあなたのものを別々に定義する必要があります。ただし、 'IRequest'から派生し、idプロパティを持つインターフェースを作成することもできます。 – HimBromBeere

+1

実際にはリフレクションを使用できますが、PersonIdプロパティ(IHasPersonInfoという名前を付けましょう)を持つリクエストタイプに対して、いくつかのインターフェースを実装する方がよいでしょう。次に、IHasPersonInfoにキャストしてプロパティを取得しようとします。 – Evk

+0

@Evkほとんどの場合、反射は物事を完了させる最悪の解決策です。 – HimBromBeere

答えて

1

中間インターフェイスの作成はどうですか?

public class RequestParameters 
{ 
    public IRequest Request { get; set; } 
}  
public interface IRequest { 
    string Username { get; set; } 
    string Password { get; set; } 
} 
public interface IRequestWithId : IRequest 
{ 
    string ID {get; set; } 
} 

ここで、IDがあるかどうかを確認する具体的なクラスではなく、そのインターフェイスで確認できます。

それ以外は、ここでは本当に悪い考えであることだけが反映されています。 (彼らと何ができるか)あなたは(物事が行われる方法を定義する)実際の種類に依存したくドント意味コード-結合を低減するインターフェイスだけその動作を定義する場合。リフレクションを使用すると、間接的に実際のタイプに依存するため、これを回避できます。さらに、リフレクションを使用することはメンテナンスには悪いことです。特に、メソッドをリファクタリングするとき(たとえば、名前の変更など)はそうです。

+0

コメントでも示唆されています。ありがとう。 私はそれを考えなかったら休憩が必要だと思います。 –

0

まず、C#で、私の意見では、あなたの状況のた​​めのより良いスーツだろう抽象クラスと呼ばれる別のタイプがあります。 this質問をご覧ください。インタフェースは変数を保持するためのものではなく、関数のみを保持するものです。

public abstract class ARequest 
{ 
    string Username { get; set; } 
    string Password { get; set; } 

    public abstract int GetId() {} 

} 
+0

ありがとうございますが、私はデザインを考え直す余裕がありません。 –

+0

あなたは何ができますか?インターフェイスに新しいメソッドを追加できますか? – Mightee

+0

この特定のインターフェイスには何も追加できません。だから私はフェッチしてオブジェクトをそのインターフェースに試してみるのに必要な特定のフィールドのための追加インターフェースを書いています。魅力のように働いた。私が言ったように、私はこれを考えることができなければ、休憩が必要だと思う。 –

関連する問題