类属性在程序集或命名空间外是只读的

时间:2015-07-31 13:43:29

标签: c# .net

我有一个类的对象,我想通过接口传递给另一个程序集。

由于我传递了一个引用,所有公开的属性,方法等都可以从它所创建的程序集外部进行修改。

有没有办法可以访问其程序集(或命名空间)中的所有公开元素,而在其他程序集(或命名空间)中,元素是只读的?

作为一种解决方法,在写入当前作用域中应该是只读的元素时,只有一个断言也没关系。

3 个答案:

答案 0 :(得分:2)

认为你想要internal访问修饰符。它限制了当前程序集的可访问性。

想象一下,我们想要构建一个Person类:

public class Person
{
   public string Name { get; set; }

   internal int Bio { get; set; }

   private int age;
   public int Age
   {
       get { return age; }
       internal set { age = value; }
   }

   public string Location { get; internal set; }
}
  • Namepublic,因此对所有集会都可见。

  • Biointernal,因此仅对当前程序集可见

  • Age有一个隐式 public的setter,因为该成员是public。 setter 明确地 internal。这意味着所有程序集都可以获取值,但只有当前程序集可以设置该值。

  • Location与上述内容相同,但属于自动属性。

您可以阅读有关访问修饰符here的更多信息。

(有一个例外,即InternalsVisibleTo属性)。

答案 1 :(得分:1)

你在寻找类似的东西:

Data

所以,在程序集外部$("#navigation li").click(function(){$(this).toggle();}); 内是读/写属性,只读

答案 2 :(得分:1)

您可以使用只读属性创建接口,您可以使用显式接口实现 内部关键字来限制从其他程序集访问您的某些成员。

这个简单的例子说明了这三种方法:

public interface IMyClass
{
    // has only getter and is read-only
    int MyProperty { get;  }

    string MyMethod();
}

class MyClass : IMyClass
{        
    // setter can be accessed only from current assembly
    public int MyProperty { get; internal set; }

    // this method can by invoked from interface (explicit implementation)
    string IMyClass.MyMethod()
    {
        return "logic for your interface to use outside the assembly";        
    }

    // this method can by invoked from current assembly only
    internal string MyMethod()
    {
        return "logic inside the assembly";
    }
}

class Program
{
    static void Main()
    {
        MyClass instance = new MyClass();

        instance.MyProperty = 10;

        // (instance as IMyClass).MyProperty = 20;        property cannot be assigned it's read-only

        Console.WriteLine((instance as IMyClass).MyProperty);

        Console.WriteLine((instance as IMyClass).MyMethod());

        Console.WriteLine(instance.MyMethod());
    }       
}    

输出:

10
logic for your interface to use outside the assembly
logic inside the assembly