gpt4 book ai didi

c# - 如果 setter 是内部的,则 Getter 不工作

转载 作者:太空狗 更新时间:2023-10-30 00:52:47 26 4
gpt4 key购买 nike

我有一个具有这个属性的类

public bool IsDeleted { get;内部设置; }

我在一些 WCF 服务上使用这个类,玩这个类的一些实例。除了 IsDeleted 之外,所有其他公共(public)属性在获取该类的实例后都是可见的。如果我将 setter 公开,IsDeleted 也会起作用。

对这种奇怪的行为有什么想法吗?

最佳答案

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

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

[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 对象传递给您,这将始终强制将 set _isDeleted 设置为 default(bool) 在您从客户那里收到的对象上。

关于c# - 如果 setter 是内部的,则 Getter 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com