对于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()
{
}
}
}
答案 0 :(得分:3)
你可以这样做:
[MyAttribute]
#if WINDOWS_PHONE
internal
#else
protected
#endif
void MyMethod()
{
}
但最好还是制作internal
或protected 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的回答看起来像是一个很好的解决方法。