C#中的OOD - 确定继承哪些属性与当前类中声明的属性

时间:2011-12-14 19:47:40

标签: c# json

考虑以下示例:

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字符串。

这可能吗?

4 个答案:

答案 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忽略该属性方面是正确的。

但是,没有办法隐瞒忽略基类的属性,继承类基类,这就是继承的工作方式。