设置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没有做我希望做的事?

设置c#“的困难;朋友";与InternalsVisibleTo的关系

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

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

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

InternalsVisibleTo适用于程序集,而不是类或命名空间。如果你的类在不同的程序集中,你需要在属性中使用程序集名称,这样它才能工作,比如:

[assembly: InternalsVisibleTo("MyAssembly")]

此外,正如一些人所评论的,您需要使用internal修饰符来标记成员,而不是使用protected修饰符。Protected允许继承类的可见性,而internal意味着成员在整个程序集或对友元程序集可见。