2011-07-05 30 views
0

对于C#中的跨平台库,我希望为了可扩展性的目的而具有一组标记为保护的方法。这些方法后来被反射访问,使用元编程与属性使用#if和#define指定访问者

然而,在Windows Phone 7的反射访问保护方法是不允许的,而是我希望为他们标记的内部。

所以我想知道的是,如果我可以这样做,在C#中,或者如果有更好的解决方法吗?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

#if WINDOWS_PHONE 
    #define ACCESSOR internal 
#else 
    #define ACCESSOR protected 
#endif 

namespace Example 
{ 
    public class MyTestClass 
    { 
     [MyAttribute]  
     ACCESSOR void MyMethod() 
     { 
     } 
    } 
} 

回答

3

你可以这样做:

[MyAttribute] 
#if WINDOWS_PHONE 
internal 
#else 
protected 
#endif 
void MyMethod() 
{   
} 

但是你最好不要让他们internalprotected internal

+0

嗯,如果该成员被标记为受保护的,那么我会得到一个安全异常。所以除非“受保护的内部”并不意味着它受到保护,否则我不确定它会有什么区别。再次,将它们标记为内部意味着其他程序集没有可扩展性(这违背了整个想法) –

+0

'protected internal'意味着它受到保护或者是内部的。试一试。 –

+0

是的,这是OR ... –

1

我不认为你可以使用的语言结构的替代,你应该能做什么常数是:

namespace Example 
{ 
    public class MyTestClass 
    { 
     [MyAttribute] 
    #if WINDOWS_PHONE 
     internal void MyMethod() 
    #else 
     protected void MyMethod() 
    #endif 
     { 
     } 
    } 
} 
0

我相信这将工作:

namespace Example 
{ 
    public class MyTestClass 
    { 
     [MyAttribute]  
#if WINDOWS_PHONE 
     internal void MyMethod() 
#else 
     protected void MyMethod() 
#endif 
     { 
     } 
    } 
} 
0

你不能使用#define这种方式。它不像C.根据MSDN

#define让你定义一个符号。当您将该符号用作传递给#if指令的表达式时,表达式将计算为true。

罗伯特皮特的答案看起来像一个很好的解决方法。