with what type net from example done create .net reflection

.net - type - what can be done with reflection in c#



BindingFlags para Type.GetMethods excluyendo acceso de propiedad (1)

Supongamos que tengo el siguiente programa:

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); } } } }

Cuando ejecuto el programa obtengo el siguiente resultado:

MethodOne MethodTwo get_Property set_Property

Quiero omitir los métodos de acceso a la propiedad. Lo he intentado con diferentes BindingFlags , por ejemplo, ~BindingFlags.SetProperty , pero sin suerte. Por el momento, la única forma que he encontrado para omitir esos métodos es volver a escribir la función iterar para:

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); } }

¿Sabes qué BindingFlags debería usar?

Actualizar:

Bueno, debería haber explicado que el proyecto es en realidad para construir automáticamente plantillas para pruebas unitarias, así puedo omitir todos los métodos especiales. Gracias por la información adicional sobre IsSpecialName :)

LINQ? De Verdad? Guau. De todos modos, este proyecto es .NET 2.0, por lo que LINQ (lamentablemente) no es una opción.


Desde lo más alto de mi cabeza:

mi.IsSpecialName &&( mi.Name.StartsWith("set_") || mi.Name.StartsWith("get_"))

debería conseguirte todo listo. SpecialName es más que un acceso a la propiedad (los métodos add add / remove también cuentan aquí), es por eso que también debes verificar los nombres.

Puedes usar LINQ para eso también :)