【问题标题】:Getters and Setters for Generics over WCFWCF 上泛型的 Getter 和 Setter
【发布时间】:2012-04-02 22:15:22
【问题描述】:

如果我在 WCF 服务中有一个泛型类

[DataContract(Name = "TestGenericOf{0}")]
public class TestGeneric<T>
{
    [DataMember]
    public string TestProperty
    {
        get { return _testProperty.ToUpper(); }
        set { _testProperty = value; }
    }

    private string _testProperty;
}

并且客户端(在本例中为 MVC)通过服务引用使用服务。我想在服务和客户端之间共享 getter 和 setter 逻辑;但是,由于该类是泛型的,因此在客户端创建的类与在服务上创建的类不同。

public partial class TestGenericOfstring : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string TestPropertyField;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string TestProperty {
        get {
            return this.TestPropertyField;
        }
        set {
            if ((object.ReferenceEquals(this.TestPropertyField, value) != true)) {
                this.TestPropertyField = value;
                this.RaisePropertyChanged("TestProperty");
            }
        }
    }
}

在服务和客户端上实现相同的 getter、setter 逻辑的最佳方法是什么?

【问题讨论】:

  • 这只是一个指定合约的数据合约,而不是明确的行为。对 ToUpper() 的调用不会出现在客户端(除非客户端有你的类)。
  • 我相信对ToUpper 的调用仍然会发生。当您的客户端调用 Web 服务时,WS 返回的数据将使用您代码中的 getter。除非您调用 WS 并获取此对象,然后反复设置并获取该属性,否则您应该没有任何问题。返回的初始对象应该调用ToUpper
  • @RyanP 非常正确,但我正在尝试在客户端中设置属性。我猜,在客户端复制逻辑的最干净的方法是什么?
  • 就像西蒙说的,客户需要课程。如果这些类是要共享的,而且看起来是共享的,那么您应该将这些类放在一个公共程序集中,并让客户端和服务器都引用它们。
  • 知道了。我遇到的问题是因为该类是泛型的,当 WCF 服务序列化该类时,它会为每个使用的泛型创建类(TestGenericOfString),因此即使类是共享的,客户端也不会使用泛型类.抱歉,我会更新我的问题。

标签: c# wcf getter-setter


【解决方案1】:

您应该能够在生成客户端代码时通过在 svcutil 中指定程序集来共享它。通用方面应该无关紧要。

查看此链接以获取示例: http://www.codeproject.com/Articles/19625/Sharing-Types-Between-WCF-Service-and-Client

更新: 您可能还想查看 KnownTypes 属性以告诉序列化程序它可以预期哪些泛型类型。

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多