类属性在程序集或命名空间外部为只读
本文关键字:外部 只读 命名空间 属性 程序集 | 更新日期: 2023-09-27 18:05:41
我有一个类的对象,我想通过接口传递给另一个程序集。
因为我传递的是一个引用,所以所有暴露的属性、方法等都可以从创建它的程序集外部修改。
是否有一种方法,我可以访问它的程序集(或名称空间)内的所有暴露的元素,并在其他程序集(或名称空间)的元素是只读的?
作为一种解决方法,在写入当前范围内应该是只读的元素时,只使用断言也是可以的。
我认为您需要 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 s 显式internal
。这意味着所有程序集都可以获得该值,但只有当前程序集可以设置该值。Location
与上面相同,但是一个自动属性。
你可以在这里阅读更多关于访问修饰符的信息。
InternalsVisibleTo
属性)你在找这样的东西吗?
public class Sample {
private int m_Data;
// property (and "get") is public - anyone can read the property
public int Data {
get { // "get" has "public" modifier as property does
return m_Data;
}
internal set { // "set" is internal - caller should be in the same assembly
m_Data = value;
}
}
}
因此,在程序集内Data
是read/write属性而readonly当它在程序集外被调用时
您可以创建具有只读属性的接口,您可以使用显式接口实现或internal关键字来限制对其他程序集的某些成员的访问。
在这个简单的示例中说明了所有三种方法:
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