我正在尝试从名为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不做我希望它做的事情?
答案 0 :(得分:1)
InternalsVisibleTo
适用于程序集,而不适用于类或名称空间。如果您的类在不同的程序集中,则需要在属性中使用程序集名称才能使其工作,如下所示:
[assembly: InternalsVisibleTo("MyAssembly")]
另外,正如有些人评论过的那样,您需要使用internal
修饰符标记成员,而不是使用protected
修饰符。受保护允许继承类的可见性,而internal
表示该成员在整个程序集或朋友程序集中可见。
答案 1 :(得分:1)
protected
与VB.NET的“Friend
”不同。由于该属性的名称为InternalsVisibleTo
,因此您应将您的成员标记为internal
。
如果您希望它同时为internal
和protected
,您可以使用protected internal
:
protected internal int _protectedCalculation() { return a+b };