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

gab*_*ish 4 c# wcf class

我有一个有这个属性的班级

public bool IsDeleted { get; internal set; }

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

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

Sco*_*ain 6

.NET中的大多数序列化方法(包括WCF)都需要可访问的getter和setter才能工作,因为它必须能够在将传入字段去离心化时将属性设置为值.

有一个解决方法,您可以将后备存储私有成员标记为序列化字段.

[DataContract]
class Foo
{
    [DataMember(Name="IsDeleted")]
    private bool _isDeleted;

    public bool IsDeleted 
    { 
       get { return _isDeleted; }
       internal set { _isDeleted = value; } 
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您的客户端没有Foo作为参考DLL的参考,它将创建一个自动生成的代理,看起来像.

class Foo
{
    public bool IsDeleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

为了防止这种情况发生,请确保关闭元数据发布,并将DLL分Foo发给将使用WCF服务的所有客户端.


如果您不想传递DLL,可以使用注释中提到的解决方法Silvermind,让setter不执行任何操作并使用内部方法来设置支持成员.

[DataContract]
class Foo
{
    private bool _isDeleted;

    public bool IsDeleted 
    { 
       get { return _isDeleted; }
       set {  } 
    }

    internal void SetIsDeletedInternal(bool value)
    {
        _isDeleted = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您执行此操作并且客户端将Foo对象传递给您,则始终强制设置_isDeleteddefault(bool)从客户端接收的对象.