使用#if和#define指定访问者

时间:2011-07-05 01:42:49

标签: c#

对于C#中的跨平台库,我希望有一组标记 protected 的方法用于扩展性目的。稍后使用带有属性

的元编程通过反射访问这些方法

但是,在Windows Phone 7上,不允许通过反射访问 protected 方法,而是希望将它们标记为内部。

所以我想知道的是,如果我可以在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()
        {
        }
    }
}

4 个答案:

答案 0 :(得分:3)

你可以这样做:

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

但最好还是制作internalprotected internal

答案 1 :(得分:1)

我认为你不能使用常量代替语言结构,你应该做的是:

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

答案 2 :(得分:0)

我相信这会奏效:

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

答案 3 :(得分:0)

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

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

Robert Pitt的回答看起来像是一个很好的解决方法。