C#类覆盖可能性

时间:2016-07-07 10:51:06

标签: c# wcf

我有一个问题,可能不能这样做,但也许还有其他一些我不知道的方式,所以我有一个看起来像这样的课:

    [DataContract] 
    public class Parent 
    {
        [DataMember(Name="id")]
        public int Id { get; set; }
        [DataMember(Name = "value")]
        public int Value { get; set; }
    }

现在这个类是不同类的属性值:

    [DataContract] 
    public class Location 
    {
        [DataMember(Name="parent")]
        public Parent Parent { get; set; }
    }

但是有一个问题,我需要相同类型的单独类,例如:

    [DataContract] 
    public class Parent 
    {
        [DataMember(Name="id")]
        public int Id { get; set; }
    } 

    [DataContract] 
    public class Parent 
    {
        [DataMember(Name = "value")]
        public int Value { get; set; }
    }

取决于Value是否为null(我需要将其作为单独的对象,因为您看到我要映射它)。是否可以覆盖类,以便一个类只能有一个或其他属性?

3 个答案:

答案 0 :(得分:1)

你可以用继承来解决它,但恕我直言,它得到了过度设计。

就个人而言,我都会进入Parent类。使属性可以为空,而不是完成。如果您想要设置至少一个属性的可靠性,您可能希望将setter设置为private(假设您在创建父项后不需要更改它们)并使用工厂方法创建具有Id或一个价值。

父封装(如果需要):

[DataContract] 
public class Parent 
{
    private Parent() {}

    [DataMember(Name="id")]
    public int? Id { get; private set; }

    [DataMember(Name = "value")]
    public int? Value { get; private set; }

    public static Parent CreateWithId(int id)
    {
        return new Parent { Id = id };
    }

    public static Parent CreateWithValue(int value)
    {
        return new Parent { Value = value };
    }
}

您可以进一步添加ParentType属性,该属性返回枚举值,该值为ParentType.ValueParent或ParentType.IdParent。同样,这仅在需要时才有用,例如因为它可以简化父母的处理,当有机会获得更多不同的类型时,或者你可能想要支持Id父级的空值为Id或与Value相同。

完全不同的解决方案是将Id和Value存储在同一属性中,因为两者都是整数。有另一种方式来区分它是Id还是Value。

[DataContract] 
public class Parent 
{
    [DataMember(Name="id")]
    public int Data { get; private set; }

    [DataMember(Name="id")]
    public ParentType ParentType { get; private set; }

    public static Parent CreateWithId(int id)
    {
        return new Parent { Data = id, ParentType = ParentType.Id };
    }

    public static Parent CreateWithValue(int value)
    {
        return new Parent { Data = value, ParentType = ParentType.Value };
    }        
} 

答案 1 :(得分:0)

您尝试通过创建两个名称相同的不同类来表示不同的数据。这是一个错误。最初我想建议使用接口或继承,但这没有任何意义,因为你编写的Parent类包含不同的东西,并且没有重叠。

如果这个案例完全是因为您需要将这些属性映射到某个数据协定,那么为什么不具有同时具有这两个属性的Parent类并只创建这些属性Nullable

有些事情:

[DataContract] 
public class Parent 
{
    [DataMember(Name="id")]
    public int? Id { get; set; }

    [DataMember(Name = "value")]
    public int? Value { get; set; }
}

答案 2 :(得分:0)

1正如所说的HimBromBree,您可以将Parent类放在不同的名称空间中。

WCF还允许您通过[DataContract]属性

为类的序列化提供不同的名称
[DataContract(Name="ParentA")]
public class Parent { 
  [DataMember(Name="id")]
  public int Id { get; set; }
}

2如果您的目标是让Parent类根据具体情况保存不同的值(Value或Id),您还可以创建两个Parent的派生类。

让我们称这些类为ParentA和ParentB

然后在Parent上,您应该声明多态序列化:

[DataContract]
[KnownType(typeof(ParentA))]
[KnownType(typeof(ParentB))]
public class Parent  {}


[DataContract(Name="ParentA")]
public class ParentA : Parent { 
  [DataMember(Name="id")]
  public int Id { get; set; }
}