我遇到了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创建一个新名称...
有没有办法避免这种行为?我需要调用它的属性...
答案 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>
{
}