属性覆盖" new"在WCF Webservice中被复制

时间:2015-07-21 10:34:45

标签: c# .net web-services inheritance serialization

我遇到了Web服务的问题,我创建了一个问题,我有一个类,用PropertyA将其命名为ClassA,他继承ClassA,使用" new"来覆盖PropertyA。像这样:

[DataContract]
public class ClassA
{
    [DataMember]
    public string PropertyA { get; set; }
    [DataMember]
    public string PropertyB { get; set; }
}

[DataContract]
public class ClassB : ClassA
{
    [DataMember]
    public new int PropertyA { get; set; }
}

这应该使ClassB"替换" ClassA中的字符串PropertyA,用于ClassB中的int PropertyA。

我在这样的服务方法中暴露了ClassB:

public bool TellMeSomething(ClassB param) { .... whatever .... }

当我在客户端应用程序中添加服务引用时,导入的类显示如下:

public class ClassA
{
    public string PropertyA { get; set; }
    public string PropertyB { get; set; }
}

public class ClassB : ClassA
{
    public int PropertyA1 { get; set; }
}

正如您所注意到的,ClassB没有"新的int PropertyA"不再是一个" int PropertyA1"。我猜序列化器发现祖先已经有了PropertyA,并且不知道如何处理" new"用于隐藏"字符串PropertyA"的关键字,因此它为继承的类中的PropertyA创建一个新名称...

有没有办法避免这种行为?我需要调用它的属性...

1 个答案:

答案 0 :(得分:1)

您应该使用 generics 而不是重新使用标识符:

[DataContract]
public class ClassA<T>
{
    [DataMember]
    public T PropertyA { get; set; }
    [DataMember]
    public int PropertyB { get; set; }
}

// No need to override PropertyA since T is int and ClassB
// inherits both PropertyA and PropertyB...
[DataContract]
public class ClassB : ClassA<int>
{
}