假设我有以下程序:
namespace ReflectionTest
{
public class Example
{
private string field;
public void MethodOne() { }
public void MethodTwo() { }
public string Property
{
get { return field; }
set { this.field = value; }
}
}
class Program
{
static void Main(string[] args)
{
iterate(typeof(Example));
Console.ReadLine();
}
public static void iterate(Type type)
{
MethodInfo[] methods = type.GetMethods(
BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.Public);
foreach (MethodInfo mi in methods)
{
Console.WriteLine(mi.Name);
}
}
}
}
当我运行程序时,我得到以下输出:
MethodOne MethodTwo get_Property set_Property
我想跳过属性访问方法。我尝试使用不同的BindingFlags
,例如~BindingFlags.SetProperty
,但没有运气。目前,我发现跳过这些方法的唯一方法是将迭代函数重写为:
public static void iterate(Type type)
{
MethodInfo[] methods = type.GetMethods(
BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.Public);
foreach (MethodInfo mi in methods)
{
if (mi.IsSpecialName) continue;
Console.WriteLine(mi.Name);
}
}
你知道我应该使用BindingFlags
吗?
好吧,我应该已经解释过该项目实际上是用于构建单元测试的自动模板,所以我可以跳过所有特殊方法。感谢有关IsSpecialName的其他信息:)
LINQ?真?哇。无论如何,这个项目是.NET 2.0,所以LINQ(遗憾地)不是一个选项。
答案 0 :(得分:17)
从头到尾:
mi.IsSpecialName &&( mi.Name.StartsWith("set_") || mi.Name.StartsWith("get_"))
应该让你全部定下来。 SpecialName不仅仅是属性访问器(事件添加/删除方法也在这里计算),这也是你必须检查名称的原因。
您也可以使用LINQ:)