2010-11-22 3 views
6

У меня есть куча методов, которые выглядят как эти два:возможно реорганизовать это в единый метод

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

У меня есть один метод для каждого свойства моего объекта pFBlock. с таким небольшим изменением между методами, я чувствую, что должен быть лучший способ сделать это, но я не могу думать ни о чем. Я использую VS 2005.

+0

Метод представляется публичным. Почему бы просто не вызвать его? Какой смысл использовать отражение? – tvanfosson

+0

этот код сгенерирован автоматически, и я не знаю, существует ли этот метод или он принимает параметры во время генерации кода. Поэтому я использую рефлексию, чтобы убедиться, что она существует и не требует никаких параметров перед вызовом. – scott

+0

может использовать 4.0 функции? если да, проверьте мой ответ на использование динамического ключевого слова. Он отлично работает с генерацией кода и обеспечивает лучшую производительность, чем чистое отражение. – Jaster

ответ

7

Как насчет 3 методов?

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

Идея здесь заключается в том, чтобы добавить вспомогательный метод, с помощью которого вы можете передать параметр. Затем вы можете использовать вспомогательный метод в своих других методах, чтобы резко сократить код.

+0

Вы не изменили строку MethodInfo, но я согласен с вашей логикой. –

+0

@Brad, спасибо, что указали это. Я не заметил эту разницу изначально. – jjnguy

+0

вы передаете объект как тип? – Jaster

0

Вы можете реорганизовать дублированный код что-то вроде этого

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

или мы используем динамические ...

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

AsDynamic. Какое пространство имен находится в этом методе? – 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]); 
      } 
     } 
    } 

Иногда разделенные функции делают код более читаемым. Вы не должны объединять свои функции как можно больше.

+0

копировать паттерн? eh – Jaster

+0

@ Jaster: Что значит? –

+0

ваше утверждение: «Иногда отдельные функции делают код более удобочитаемым. Нельзя объединять свои функции как можно больше». звучит немного так:) на самом деле слияние кода всегда хорошо. – Jaster

0

Попробуйте это. Типировано не проверено.

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]); 
        } 
       } 
     } 
    } 
} 
Смежные вопросы