我有一个具有此属性的类
public bool IsDeleted { get; internal set; }
我在一些WCF服务上使用这个类,玩这个类的一些实例。获取类的实例后,所有其他公共属性都可见,但IsDeleted除外。如果我公开setter,IsDeleted也会工作。
这种奇怪行为的任何想法?
答案 0 :(得分:6)
.NET中的大多数序列化方法(包括WCF)都需要一个可访问的getter和setter才能工作,因为它必须能够在将传入字段去离心化时将属性设置为一个值。
有一个解决方法,您可以将支持商店私有成员标记为序列化字段。
[DataContract]
class Foo
{
[DataMember(Name="IsDeleted")]
private bool _isDeleted;
public bool IsDeleted
{
get { return _isDeleted; }
internal set { _isDeleted = value; }
}
}
但是,如果您的客户端没有引用Foo
作为参考DLL,它将创建一个自动生成的代理,看起来像。
class Foo
{
public bool IsDeleted { get; set; }
}
为防止这种情况发生,请确保关闭元数据发布,并将Foo
的DLL分发给将使用您的WCF服务的所有客户端。
如果您不想传递DLL,可以使用解决方法Silvermind mentioned in the comments使setter不执行任何操作并使用内部方法设置后备成员。
[DataContract]
class Foo
{
private bool _isDeleted;
public bool IsDeleted
{
get { return _isDeleted; }
set { }
}
internal void SetIsDeletedInternal(bool value)
{
_isDeleted = value;
}
}
但是请注意,如果您执行此操作并且客户端将Foo
对象传递给您,则始终会强制将_isDeleted
设置为default(bool)
对象,而是从客户端收到的对象。