C# 带有';内部';集合访问器变为不可见
在客户端,我只看到TaskID属性。我不明白为什么“ID”属性不可见? 如果我删除“内部”,它会工作。但我需要它是内在的 我的错,我应该提到这是WCFC# 带有';内部';集合访问器变为不可见,c#,wcf,C#,Wcf,在客户端,我只看到TaskID属性。我不明白为什么“ID”属性不可见? 如果我删除“内部”,它会工作。但我需要它是内在的 我的错,我应该提到这是WCF 谢谢你的回答。我意识到我正在尝试的是不可能的。如果删除内部修饰符,setter将具有公共可见性。内部元素对位于同一程序集中的类型可见,因此如果您的客户端位于另一个程序集中,则setter将不可见。为什么说客户端,是指从web服务返回类?如果是这种情况,.NET要求getter和setter都是公共的,以便在XML序列化操作中包含属性。假设您的请
谢谢你的回答。我意识到我正在尝试的是不可能的。如果删除
内部
修饰符,setter将具有公共
可见性。内部元素对位于同一程序集中的类型可见,因此如果您的客户端位于另一个程序集中,则setter将不可见。为什么说客户端,是指从web服务返回类?如果是这种情况,.NET要求getter和setter都是公共的,以便在XML序列化操作中包含属性。假设您的请求类是DataContract,则所有属性都必须具有公共getter和setter。否则,在“另一方”构建类是不可能的。因此,它不能是DataContract。使用内部修饰符只能访问:
由同一程序集中的任何代码执行,但不是来自另一个程序集
如果您在派生类中引用它,则使用
public class Request
{
public string ID { get; internal set; }
public int TaskID { get; set; }
public Request()
{
ID = System.Guid.NewGuid().ToString();
}
}
另一种方式是
您需要使用InternalsVisibleTo属性使程序集成为好友
假设您没有对程序集进行签名,只需将程序集级别InternalsVisibleTo属性添加到名为VB.Net程序集的C#项目中即可。通常在AssemblyInfo.cs(属性文件夹下)中执行此操作
嗯,;假设这是一项服务,一种解决方法是为客户端提供某种哈希令牌而不是真实ID,然后,在收到客户端的请求后,您可以按令牌查找真实ID,或者在他们更改它时引发异常。假设您使用的是WCF,此对象的代理将只包含同时具有公共getter和setter的项。您无法真正绕过这个问题,因为在反序列化对象时,服务器端代理需要调用setter。如果您不担心反序列化,您可以创建一个不执行任何操作的setter并将其公开,并创建一个充当真正setter的内部函数。成员只能从同一程序集中访问。您将无法从存在于不同程序集中的代码中使用它们。您所说的“客户端”是什么意思?您使用WCF吗?您的意思是“在客户端”,setter应该可以访问与请求相同程序集中的任何类。整个属性是否不可见,还是其setter不可见?
Protected internal
[assembly:InternalsVisibleTo("MyVbAssemblyName")]