考虑以下示例:
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字符串。例如,我想以某种方式从InheritingClass中的3个属性中创建一个JSON对象,但如果我这样做:
InheritingClass a = new InheritingClass();
JavaScriptSerializer jss = new JavaScriptSerializer();
string jsonString = jss.Serialize(a);
jsonString 值将包含BaseClass的所有属性以及InheritingClass的所有属性。我理解这是正常的,因为我继承了所有这些属性。我想要做的是不包括那些继承的属性,并仅在InheritingClass中的3个属性中构建一个JSON字符串。
这可能吗?
答案 0 :(得分: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;}
}
答案 1 :(得分:1)
如果您从不想要序列化这些属性(即使在序列化基类或其他派生类时),您可以将ScriptIgnore属性添加到基类:
public class BaseClass
{
[ScriptIgnore]
public string StringInBaseClass {get;set;}
[ScriptIgnore]
public int IntInBaseClass {get;set;}
}
答案 2 :(得分:1)
不考虑继承成员的此代码返回属性(PropertyInfo []的类型):
typeof(InheritingClass).GetProperties(BindingFlags.DeclaredOnly)
答案 3 :(得分:0)
Yuri在如何让json忽略该属性方面是正确的。
但是,没有办法隐瞒忽略基类的属性,继承类是基类,这就是继承的工作方式。