OOD在C#中 - 确定哪些属性继承VS这在当前类
问题描述:
请看下面的例子声明: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字符串。
这可能吗?
答
在您不想使用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;}
}
答
尤里是如何获得JSON忽略属性正确。
但是,没有办法隐含基类的属性,继承类是的基类,这就是继承的工作原理。
答
如果从未希望(序列化基类或其他派生类时甚至)序列化的属性,你可以在ScriptIgnore属性添加到基类:
public class BaseClass
{
[ScriptIgnore]
public string StringInBaseClass {get;set;}
[ScriptIgnore]
public int IntInBaseClass {get;set;}
}
答
此代码返回属性(类型PropertyInfo [])继承成员不考虑:
typeof(InheritingClass).GetProperties(BindingFlags.DeclaredOnly)
为什么要这么做? – Oded 2011-12-14 19:49:15
听起来更像是一个序列化问题,而不是一个面向对象的设计和多态问题。建议如何禁用`BaseClass`属性的序列化。 – Reddog 2011-12-14 19:51:37