【问题标题】:Property overriden with "new" gets dupped in WCF Webservice带有“新”的属性覆盖浸入 WCF Web 服务
【发布时间】:2015-07-21 10:34:44
【问题描述】:

我正在创建的 Web 服务有问题,问题是,我有一个类,用 PropertyA 将其命名为 ClassA,他是 ClassB 继承 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 不再有“new int PropertyA”,而是“int PropertyA1”。我猜序列化器发现祖先已经有一个PropertyA并且不知道如何处理“new”关键字来隐藏“字符串PropertyA”,所以它在继承类中为PropertyA创建一个新名称......

有没有办法避免这种行为?我需要像应该调用的那样调用该属性...

【问题讨论】:

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


    【解决方案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>
    {
    }
    

    【讨论】:

    • 当你只有一两次出现这种情况时,这是一个可能的解决方案,但是我有几个必须隐藏的属性,我会以很多会破坏代码分析规则的泛型结束我的公司:msdn.microsoft.com/en-us/library/ms182129.aspx
    • @JoanVilariño 泛型如何破坏代码分析规则? ;)
    • @JoanVilariño 归根结底,您需要在编码时将积极的重构作为必要的操作来处理...我的意思是,告诉您的老板这是 WCF 解决问题的方法!
    • @JoanVilariño 在最坏的情况下,您可以用其他名称声明整个属性,并在代码中将PropertyX 视为PropertyB.......顺便说一句,有多少类您需要更改以使用泛型吗?再说一次使用泛型是一种不好的做法吗? 难以置信!
    • 我并不是说使用泛型是一种不好的做法……但在我的公司中,这些规则是有效的,他们“建议”不要禁用它们……无论如何,正如我在我的第一个回复,你的解决方案很好。我找到了另一种不继承的方法......最后,这些实体只是我传递给我的域层的DTO,所以我将它们分开,然后映射到我的域层的一个公共类,它是解决了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多