Предположим, у меня есть следующая программа:
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 (к сожалению) не вариант.