如果setter是内部的,则getter无法正常工作

时间:2013-11-12 18:05:10

标签: c# wcf class

我有一个具有此属性的类

public bool IsDeleted { get; internal set; }

我在一些WCF服务上使用这个类,玩这个类的一些实例。获取类的实例后,所有其他公共属性都可见,但IsDeleted除外。如果我公开setter,IsDeleted也会工作。

这种奇怪行为的任何想法?

1 个答案:

答案 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)对象,而是从客户端收到的对象。