【问题标题】:c# class property with 'internal' set accessor becomes invisiblec# 具有“内部”设置访问器的类属性变得不可见
【发布时间】:2011-07-12 19:30:12
【问题描述】:
public class Request
{
    public string ID { get; internal set; }
    public int TaskID { get; set; }

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

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

我的错,我应该提到它是 WCF。


感谢您的所有回答。我意识到我正在尝试的事情是不可能的。

【问题讨论】:

  • Internal 成员只能从同一个程序集中访问。您将无法从存在于不同程序集中的代码中使用它们。
  • “客户端”是什么意思?你在使用 WCF 吗?
  • “在客户端”是什么意思,setter 应该可以被与 Request 相同的程序集中的任何类访问。
  • 是整个属性不可见,还是它的 setter 不可见?

标签: c# wcf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    假设您的请求类是 DataContract,则所有属性都必须具有公共 getter 和 setter。否则无法在“另一端”构建类。因此它不能是 DataContract。

    【讨论】:

      【解决方案3】:

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

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

      Protected internal
      

      另一种方式是

      您需要使用 InternalsVisibleTo 属性与程序集交朋友。

      假设您没有对程序集进行签名,只需将程序集级别 InternalsVisibleTo 属性添加到具有 VB.Net 程序集名称的 C# 项目即可。通常您在 AssemblyInfo.cs 中执行此操作(在 Properties 文件夹下)

      [assembly:InternalsVisibleTo("MyVbAssemblyName")]
      

      【讨论】:

        【解决方案4】:

        假设您使用的是 WCF,则此对象的代理将仅包含具有公共 getter 和 setter 的项目。您无法真正解决这个问题,因为在反序列化对象时,服务器端代理将需要调用 setter。如果您不担心反序列化,您可以创建一个不执行任何操作并将其公开的 setter,并创建一个充当真正 setter 的内部函数。

        【讨论】:

          【解决方案5】:

          好的;假设这是一项服务,解决方法是给客户端某种散列令牌而不是真实 ID,然后,在收到来自客户端的请求后,您可以通过令牌查找真实 ID,或者在以下情况下抛出异常他们改变了它。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2023-03-11
              • 1970-01-01
              • 2015-11-24
              • 1970-01-01
              • 1970-01-01
              • 2012-06-25
              • 1970-01-01
              • 1970-01-01
              • 2019-05-11
              相关资源
              最近更新 更多