2010-11-22 16 views
6

tengo un montón de métodos que se parecen a estos dos:es posible refactorizar esto en un solo método

public void SourceInfo_Get()  
    { 
     MethodInfo mi = pFBlock.SourceInfo.GetType().GetMethod("SendGet"); 
     if (mi != null) 
     { 
      ParameterInfo[] piArr = mi.GetParameters(); 
      if (piArr.Length == 0) 
      { 
       mi.Invoke(pFBlock.SourceInfo, new object[0]); 
      } 
     } 
    } 
    public void SourceAvailable_Get() 
    { 
     MethodInfo mi = pFBlock.SourceAvailable.GetType().GetMethod("SendGet"); 
     if (mi != null) 
     { 
      ParameterInfo[] piArr = mi.GetParameters(); 
      if (piArr.Length == 0) 
      { 
       mi.Invoke(pFBlock.SourceAvailable, new object[0]); 
      } 
     } 
    } 

tengo un método para cada propiedad en mi objeto pFBlock. con tan poco cambio entre los métodos, creo que debería haber una mejor manera de hacerlo, pero no puedo pensar en ninguno. Estoy usando VS 2005.

+0

El método parece ser público. ¿Por qué no invocarlo? ¿De qué sirve usar la reflexión? – tvanfosson

+0

este código se genera automáticamente y no sé si el método existe o si toma parámetros en el tiempo de generación del código. Así que estoy usando la reflexión para asegurarme de que existe y no requiere ningún parámetro antes de llamar. – scott

+0

¿puedes usar las características 4.0? si es así, verifique mi respuesta para el uso de la palabra clave dinámica. Funciona bien con la generación de código y proporciona un rendimiento mucho mejor que la reflexión pura. – Jaster

Respuesta

7

¿Qué tal 3 métodos?

public void SourceInfo_Get()  
{ 
    SendGet(pFBlock.SourceInfo); 
} 

public void SourceAvailable_Get() 
{ 
    SendGet(pFBlock.SourceAvailable); 
} 

private void SendGet(Object obj) { 
    MethodInfo mi = obj.GetType().GetMethod("SendGet"); 
    if (mi != null) 
    { 
     ParameterInfo[] piArr = mi.GetParameters(); 
     if (piArr.Length == 0) 
     { 
      mi.Invoke(obj, new object[0]); 
     } 
    } 
} 

La idea aquí es agregar un método de ayuda en el que pueda pasar un parámetro. Luego puede usar el método auxiliar en sus otros métodos para acortar drásticamente su código.

+0

No ha cambiado la línea MethodInfo, pero estoy de acuerdo con su lógica. –

+0

@rad, gracias por señalar eso. No noté esa diferencia inicialmente. – jjnguy

+0

pasas un objeto como tipo? – Jaster

0

Usted podría refactorizar el código duplicado algo como esto

private void Source_Get(Object source) 
    { 
     MethodInfo mi = source.GetType().GetMethod("SendGet"); 
     if (mi != null) 
     { 
      ParameterInfo[] piArr = mi.GetParameters(); 
      if (piArr.Length == 0) 
      { 
       mi.Invoke(source, new object[0]); 
      } 
     } 
    } 

public void SourceInfo_Get() 
    { 
     Source_Get(pFBlock.SourceInfo); 
    } 

public void SourceAvailable_Get() 
    { 
     Source_Get(pFBlock.SourceAvailable) 
    } 
0
public void SourceAvailable_Get() 
{ 
    CallMethod(pFBlock.SourceAvailable); 
} 

private void CallMethod(object source, String methodName = "SendGet") 
{ 
    MethodInfo mi = source.GetType().GetMethod(methodName); 
    if (mi != null) 
    { 
     if (mi.GetParameters().Length == 0) 
     { 
      mi.Invoke(source, new object[0]); 
     } 
    } 
} 

o utilizamos dinámico ...

public void CallSendGet(object obj) 
{ 
    obj.AsDynamic().SendGet(); 
} 
+0

AsDynamic - ¿En qué espacio de nombres se encuentra ese método? – Pedro

0
public void Source_Get(string memberName) 
    { 
     object member = pFBlock.GetMember(memberName); 
     MethodInfo mi = member.GetType().GetMethod("SendGet"); 
     if (mi != null) 
     { 
      ParameterInfo[] piArr = mi.GetParameters(); 
      if (piArr.Length == 0) 
      { 
       mi.Invoke(member, new object[0]); 
      } 
     } 
    } 

funciones separadas veces que el código sea más legible. No deberías unir tus funciones tanto como sea posible.

+0

copiar patrón de pegar? eh – Jaster

+0

@Jaster: ¿Qué quieres decir? –

+0

su declaración: "A veces, las funciones separadas hacen que el código sea más legible. No debe combinar sus funciones tanto como sea posible". suena un poco así;) en realidad, fusionar el código siempre es algo bueno. – Jaster

0

Pruebe esto. Mecanografiado no probado

private void MasterGet(PFBlock pFBlock, string propertyName) 
{ 
    Type t = pFBlock.GetType(); 

    // Cycle through the properties. 
    foreach (PropertyInfo p in t.GetProperties()) 
    { 
     if(p.Name == propertyName) 
     { 
      MethodInfo mi = p.GetType().GetMethod("SendGet"); 
       if (mi != null) 
       { 
       ParameterInfo[] piArr = mi.GetParameters(); 
       if (piArr.Length == 0) 
        { 
         mi.Invoke(p, new object[0]); 
        } 
       } 
     } 
    } 
} 
Cuestiones relacionadas