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。
谢谢你的回答。我意识到我所尝试的是不可能的。
为什么你说客户端,你的意思是你从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将不可见。