如果您正在创建库,则可以使用私有/内部类定义公共接口。任何需要将只读类的实例返回给外部使用者的方法都应该改为返回只读接口的实例。现在,向下转换为具体类型是不可能的,因为该类型没有公开公开。
实用程序库
public interface IReadOnlyClass
{
string SomeProperty { get; }
int Foo();
}
public interface IMutableClass
{
string SomeProperty { set; }
void Foo( int arg );
}
你的图书馆
internal MyReadOnlyClass : IReadOnlyClass, IMutableClass
{
public string SomeProperty { get; set; }
public int Foo()
{
return 4; // chosen by fair dice roll
// guaranteed to be random
}
public void Foo( int arg )
{
this.SomeProperty = arg.ToString();
}
}
public SomeClass
{
private MyThing = new MyReadOnlyClass();
public IReadOnlyClass GetThing
{
get
{
return MyThing as IReadOnlyClass;
}
}
public IMutableClass GetATotallyDifferentThing
{
get
{
return MyThing as IMutableClass
}
}
}
现在,任何使用的人SomeClass
都会得到看起来像两个不同对象的东西。当然,他们可以使用反射来查看底层类型,这会告诉他们这实际上是具有相同类型的同一个对象。但是该类型的定义在外部库中是私有的。在这一点上,在技术上仍然可以得到定义,但它需要重型巫术才能完成。
根据您的项目,您可以将上述库合并为一个。没有什么可以阻止它;只是不要在要限制其权限的任何 DLL 中包含上述代码。
感谢 XKCD的评论。