2012-09-18 62 views
6

dado algunas clases de esta manera:No vuelva ToString, iguales, GetHashCode, GetType con Type.GetMethods()

public class MyBaseClass() 
{ 
    public void MyMethodOne() 
    { 
    } 

    public virtual void MyVirtualMethodOne() 
    { 
    } 
} 

public class MyMainClass : MyBaseClass() 
{ 
    public void MyMainClassMethod() 
    { 
    } 

    public override void MyVirtualMethodOne() 
    { 
    } 
} 

Si funciono el siguiente:

var myMethods= new MyMainClass().GetType().GetMethods(); 

que volver:

  • MyMethodOne
  • MyVirtualMethodOne
  • MyMainClassMethod
  • ToString
  • Igual
  • GetHashCode
  • GetType

¿Cómo puedo evitar los 4 últimos métodos son vueltos en myMethods

  • ToString
  • Igual
  • GetHashCode
  • GetType

EDITAR

Hasta el momento, este truco funciona, pero se preguntaba si había una manera más limpia:

 var exceptonList = new[] { "ToString", "Equals", "GetHashCode", "GetType" }; 
     var methods = myInstanceOfMyType.GetType().GetMethods() 
      .Select(x => x.Name) 
      .Except(exceptonList); 
+1

Usted puede usar ['BindingFlags.DeclaredOnly'] (http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx) para obtener' MyMainClassMethod' y 'MyVirtualMethodOne', pero yo no Creo que hay una bandera correspondiente para "métodos declarados hasta, pero sin incluir, aquellos en' objeto' ". – Rawling

Respuesta

7

También puede hacer el truco:

var methods = typeof(MyMainClass) 
        .GetMethods() 
        .Where(m => !typeof(object) 
            .GetMethods() 
            .Select(me => me.Name) 
            .Contains(m.Name)); 
4

probar esto.

GetMethods().Where((mi)=> mi.DeclaringType != typeof(object)); 

Con un poco de LINQ, puede eliminar todos los métodos declarados en object clase.

+0

Esto no es lo que quiere, esto solo dará dos de los tres métodos. – Rawling

+2

De hecho, me da cero métodos ...: -s – Alex

+1

Sí, necesitarías usar 'BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly'. (Estos tres primeros son los indicadores utilizados por la sobrecarga 'GetMethods()'.) – Rawling

8

Si utiliza

var myMethods = new MyMainClass().GetType().GetMethods() 
    .Where(m => m.DeclaringType != typeof(object)); 

que descartará estos cuatro métodos de abajo, a menos que hayan sido anulado en algún lugar de su jerarquía.

(me gustaría que este comportamiento a mí mismo, pero si quieres los cuatro excluido lo, entonces la respuesta de Cuong va a hacer esto.)

+0

Upvoted para devolverlos, sin embargo, en este caso, quería excluirlos por completo – Alex

Cuestiones relacionadas