c#类属性'internal'Set访问器变得不可见

本文关键字:Set 属性 internal 访问 | 更新日期: 2023-09-27 18:01:48

public class Request
{
    public string ID { get; internal set; }
    public int TaskID { get; set; }
    public Request()
    {
        ID = System.Guid.NewGuid().ToString();
    }
}

在客户端我只看到TaskID属性。我不明白为什么'ID'属性不可见?如果我删除'内部',它工作。但是我需要它是内部的。

我的错,我应该告诉你这是WCF。


谢谢你的回答。我意识到我所尝试的是不可能的。

c#类属性'internal'Set访问器变得不可见

为什么你说客户端,你的意思是你从web服务返回类?如果是这种情况,. net要求getter和setter都是公共的,以便在XML序列化操作中包含属性。

假设您的请求类是一个DataContract,那么所有属性都必须有一个公共的getter和setter。否则,在"另一边"构造类是不可能的。因此,它不能是一个数据合约。

通过使用内部修饰符,它只能被访问:通过同一程序集中的任何代码,但不能来自另一个程序集中。

如果你在派生类中引用它使用

Protected internal

另一个方法是

你需要使用InternalsVisibleTo属性使程序集成为朋友。

假设你不签名你的程序集,它就像添加一个程序集级别的InternalsVisibleTo属性到c#项目的VB名称一样简单。净组装。通常在AssemblyInfo.cs(在Properties文件夹下)

中执行此操作。
[assembly:InternalsVisibleTo("MyVbAssemblyName")]

假设您正在使用WCF,该对象的代理将只具有公共getter和setter的项。您无法真正绕过这个问题,因为在对对象进行反序列化时,服务器端代理将需要调用setter。如果你不担心反序列化,你可以创建一个不做任何事情的setter并将其公开,并创建一个内部函数作为真正的setter。

ok;假设这是一个服务,一个解决方法是给客户端提供某种散列令牌而不是真实ID,然后,在从客户端收到请求后,您可以通过令牌查找真实ID,或者如果他们更改了它就抛出异常。

如果您删除internal修饰符,则setter将具有public可见性。内部元素对于位于同一程序集中的类型是可见的,因此如果您的客户端位于另一个程序集中,则setter将不可见。