我有一个问题,可能不能这样做,但也许还有其他一些我不知道的方式,所以我有一个看起来像这样的课:
[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(我需要将其作为单独的对象,因为您看到我要映射它)。是否可以覆盖类,以便一个类只能有一个或其他属性?
答案 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; }
}