带有'internal'set accessor的c#class属性变得不可见

时间:2011-07-12 19:30:13

标签: c# wcf

public class Request
{
    public string ID { get; internal set; }
    public int TaskID { get; set; }

    public Request()
    {
        ID = System.Guid.NewGuid().ToString();
    }
}

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

我的不好,我应该提到它是WCF。


感谢所有答案。我意识到我正在尝试的是不可能的。

6 个答案:

答案 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,或者抛出异常,如果他们改变了它。