2011-12-14 29 views
0

請看下面的例子聲明:OOD在C#中 - 確定哪些屬性繼承VS這在當前類

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字符串。例如,我想以某種方式創建一個JSON對象了剛剛在InheritingClass 3個屬性,但如果我這樣做:

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

jsonString值將所有的BaseClass的性能以及所有InheritingClass的屬性。我知道這很正常,因爲我繼承了所有這些屬性。我期望做的不是包括那些繼承的屬性,並且只有InheritingClass中的3個屬性構建JSON字符串。

這可能嗎?

+0

爲什麼要這麼做? – Oded 2011-12-14 19:49:15

+0

聽起來更像是一個序列化問題,而不是一個面向對象的設計和多態問題。建議如何禁用`BaseClass`屬性的序列化。 – Reddog 2011-12-14 19:51:37

回答

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忽略屬性正確。

但是,沒有辦法隱含基類的屬性,繼承類的基類,這就是繼承的工作原理。

1

如果從未希望(序列化基類或其他派生類時甚至)序列化的屬性,你可以在ScriptIgnore屬性添加到基類:

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

此代碼返回屬性(類型PropertyInfo [])繼承成員不考慮:

typeof(InheritingClass).GetProperties(BindingFlags.DeclaredOnly)