我有一个类的对象,我想通过接口传递给另一个程序集。
由于我传递了一个引用,所有公开的属性,方法等都可以从它所创建的程序集外部进行修改。
有没有办法可以访问其程序集(或命名空间)中的所有公开元素,而在其他程序集(或命名空间)中,元素是只读的?
作为一种解决方法,在写入当前作用域中应该是只读的元素时,只有一个断言也没关系。
答案 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; }
}
Name
为public
,因此对所有集会都可见。
Bio
为internal
,因此仅对当前程序集可见。
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