设置c#“的困难;朋友";与InternalsVisibleTo的关系
本文关键字:关系 quot 朋友 InternalsVisibleTo 的困难 设置 | 更新日期: 2023-09-27 18:28:06
我正试图建立一个从名为MyObject的类到MemoryManager的朋友关系。也就是说,我希望MemoryManager能够访问MyObject中所有受保护的元素(这样它就可以完成自己的工作)。
我有一个文件:
namespace my_namespace
{
public class MemoryManager
{
public int someMethod(MyObject o) {
int k = o._protectedCalculation();
}
}
}
在另一个文件中:
[assembly: InternalsVisibleTo("my_namespace.MemoryManager")]
namespace my_namespace
{
public class MyObject
{
protected int a;
protected int b;
protected int _protectedCalculation() { return a+b };
}
}
我认为这将允许MemoryManager访问o._protectedMember,但这给了我错误:
my_namespace.MyObject._protectedCalculation() is inaccessible due to its protection level
有人看到我做错了什么吗?还是InternalsVisibleTo没有做我希望做的事?
protected
与VB.NET的"Friend
"不同。由于属性名为InternalsVisibleTo
,因此应将成员标记为internal
。
如果您希望它同时为internal
和protected
,则可以使用protected internal
:
protected internal int _protectedCalculation() { return a+b };
InternalsVisibleTo
适用于程序集,而不是类或命名空间。如果你的类在不同的程序集中,你需要在属性中使用程序集名称,这样它才能工作,比如:
[assembly: InternalsVisibleTo("MyAssembly")]
此外,正如一些人所评论的,您需要使用internal
修饰符来标记成员,而不是使用protected
修饰符。Protected允许继承类的可见性,而internal
意味着成员在整个程序集或对友元程序集可见。