public class Request
{
public string ID { get; internal set; }
public int TaskID { get; set; }
public Request()
{
ID = System.Guid.NewGuid().ToString();
}
}
在客户端,我只看到TaskID属性。我不明白为什么'ID'属性不可见? 如果我删除'内部'它是有效的。但我需要它是内部的。
我的不好,我应该提到它是WCF。
感谢所有答案。我意识到我正在尝试的是不可能的。
答案 0 :(得分:4)
为什么你说客户端,你是说你是从Web服务返回课程吗?如果是这种情况,.NET要求getter和setter都是公共的,以便将属性包含在XML序列化操作中。
答案 1 :(得分:1)
假设您的请求类是DataContract,则所有属性都必须具有公共getter和setter。否则,在“其他”方面建造班级是不可能的。因此它不是DataContract。
答案 2 :(得分:1)
通过使用内部修饰符,它只能访问: 通过同一个程序集中的任何代码,但不是来自另一个程序集。
如果您在派生类中引用它而不是使用
Protected internal
Anoteher Way是
您需要使用InternalsVisibleTo属性制作程序集的朋友。
假设您没有对程序集进行签名,就像使用VB.Net程序集的名称向C#项目添加程序集级别的InternalsVisibleTo属性一样简单。通常,您可以在AssemblyInfo.cs(在“属性”文件夹下)
中执行此操作[assembly:InternalsVisibleTo("MyVbAssemblyName")]
答案 3 :(得分:1)
假设您正在使用WCF,此对象的代理将只包含具有公共getter和setter的项目。你无法真正解决这个问题,因为在反序列化对象时,服务器端代理需要调用setter。如果您不担心反序列化,可以创建一个不执行任何操作并将其公开的setter,并创建一个充当真正setter的内部函数。
答案 4 :(得分:0)
如果您移除internal
修饰符,则设置者将具有public
可见性。内部元素对于位于同一程序集中的类型是可见的,因此如果您的客户端位于另一个程序集中,则setter将不可见。
答案 5 :(得分:0)
确定;假设这是一项服务,一种解决方法是给客户端提供某种散列令牌而不是真实ID,然后,当从客户端收到请求后,您可以通过令牌查找真实ID,或者抛出异常,如果他们改变了它。