2014-10-28 95 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意味着該成員在整個裝配體或朋友裝配體中可見。