.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 :)