2011-12-14 10 views
0

は、次の例を考えてみましょう:OOD - 現在のクラスで宣言されているプロパティが継承されいるかを調べるた対

public class BaseClass 
{ 
    public string StringInBaseClass {get;set;} 
    public int IntInBaseClass {get;set;} 
} 

public InheritingClass : BaseClass 
{ 
    public long LongInInheritingClass {get;set;} 
    public long ShortInInheritingClass {get;set;} 
    public long CharInInheritingClass {get;set;} 
} 

、私がやりたいことはJSON文字列にJUST継承プロパティをシリアル化です。例えば、私は何とかInheritingClassでわずか3つのプロパティのうち、JSONオブジェクトを作成したいが、私は行った場合:

InheritingClass a = new InheritingClass(); 
JavaScriptSerializer jss = new JavaScriptSerializer(); 
string jsonString = jss.Serialize(a); 

jsonString値はBaseClassののすべてのプロパティだけでなく、すべてを持っていますInheritingClassのプロパティの私はこれらのプロパティのすべてを継承しているので、これは正常であると理解しています。私が探しているのは、継承されたプロパティを含めずに、InheritingClassの3つのプロパティのみからJSON文字列を構築することです。

これは可能ですか?

+0

なぜそれをしたいですか? – Oded

+0

オブジェクト指向設計や多形性問題よりも直列化問題に似ています。 'BaseClass'プロパティの直列化を無効にする方法を提案してください。 – Reddog

+2

あなたの遺産の瑕疵に非常によく似たにおいがします。時にはオブジェクトの一部だけが必要な場合は、is-a関係が存在すると主張するのは難しくなります。つまり、aaaの構成と同じように聞こえます。 –

答えて

3

JavaScriptSerializerでシリアル化したくないプロパティのいずれかにScriptIgnoreAttributeを使用してください。これを使用すると、直列化されることから、基本クラスからプロパティを停止するには、あなたの継承されたクラスで、次の操作を行うことができます。

public class BaseClass 
{ 
    public virtual string StringInBaseClass {get;set;} 
    public int IntInBaseClass {get;set;} 
} 

public class InheritingClass : BaseClass 
{ 
    [ScriptIgnore] 
    public override string StringInBaseClass 
    { 
     get 
     { 
      return base.StringInBaseClass; 
     } 
     set 
     { 
      base.StringInBaseClass = value; 
     } 
    } 
    public long LongInInheritingClass {get;set;} 
    public long ShortInInheritingClass {get;set;} 
    public long CharInInheritingClass {get;set;} 
} 
0

ユーリは、JSONプロパティを無視するように取得する方法で正しいです。

しかし、暗黙的に基本クラスのプロパティを無視する方法はありません。継承クラスは、基本クラスです。継承の仕組みです。

+0

ええ、私はそれを理解しています。私はプロパティを継承しようとしていませんでした。継承クラスで宣言されたVSを継承したプロパティを特定しようとしました。 – MattW

1

あなたはは(基底クラスや他の派生クラスをシリアル化する場合でも)あなたは、基本クラスにScriptIgnore属性を追加することができ、これらのプロパティをシリアル化したくない場合は、次の(

public class BaseClass 
{ 
    [ScriptIgnore] 
    public string StringInBaseClass {get;set;} 
    [ScriptIgnore] 
    public int IntInBaseClass {get;set;} 
} 
1

このコードの戻りプロパティタイプをのメンバーを継承したPropertyInfo [])は考慮されません。

typeof(InheritingClass).GetProperties(BindingFlags.DeclaredOnly) 
関連する問題