2014-10-28 97 views
2

我想建立一个名为MyObject的类到MemoryManager的朋友关系。这意味着,我希望MemoryManager能够访问MyObject中的所有受保护的元素(以便它可以完成它的工作)。难以设置c#“朋友”关系InternalsVisibleTo

我有一个文件:

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 

有没有人看到我在做什么错,还是InternalsVisible不做我希望的事d OES?

+3

['InternalsVisibleTo'](http://msdn.microsoft.com/en-us/library/system .runtime.compilerservices.internalsvisibletoattribute.aspx)给标记为'internal'的成员提供了一个不同的* assembly *访问权限(通常只在其自己的程序集中可见)。它没有做任何关于'protected'的事情。 – Blorgbeard 2014-10-28 19:22:52

+1

“内存管理器”类可能更适合简单地使用反射访问私有/受保护成员。但是你知道C#已经为你管理内存了,对吧? – Blorgbeard 2014-10-28 19:29:04

回答

1

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

如果你希望它是既internalprotected,您可以使用protected internal

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

InternalsVisibleTo适用于程序集,不适用于类或名称空间。如果你的类在不同的组件,您需要使用组件名称的属性里面,它的工作,像这样:

[assembly: InternalsVisibleTo("MyAssembly")] 

而且,如一些人评论,您需要与internal成员标记修饰符,而不是与protected之一。受保护允许继承类的可见性,而internal意味着该成员在整个装配体或朋友装配体中可见。