【发布时间】: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