难以设置c#"朋友"与InternalsVisibleTo的关系

时间:2014-10-28 19:20:44

标签: c#

我正在尝试从名为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不做我希望它做的事情?

2 个答案:

答案 0 :(得分:1)

InternalsVisibleTo适用于程序集,而不适用于类或名称空间。如果您的类在不同的程序集中,则需要在属性中使用程序集名称才能使其工作,如下所示:

[assembly: InternalsVisibleTo("MyAssembly")]

另外,正如有些人评论过的那样,您需要使用internal修饰符标记成员,而不是使用protected修饰符。受保护允许继承类的可见性,而internal表示该成员在整个程序集或朋友程序集中可见。

答案 1 :(得分:1)

protected与VB.NET的“Friend”不同。由于该属性的名称为InternalsVisibleTo,因此您应将您的成员标记为internal

如果您希望它同时为internalprotected,您可以使用protected internal

protected internal int _protectedCalculation() { return a+b };