2010-11-22 15 views
6

में इस refactor करने के लिए मैं तरीकों कि इन दोनों की तरह लग रही का एक समूह है है। तरीकों के बीच बहुत कम परिवर्तन के साथ मुझे लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए, लेकिन मैं किसी के बारे में नहीं सोच सकता। मैं वीएस 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

@ ब्रैड, इसे इंगित करने के लिए धन्यवाद। मैंने शुरुआत में उस अंतर को नहीं देखा। – 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]); 
     } 
    } 
} 

या हम गतिशील का उपयोग की तरह नकली कोड कुछ refactor सकता है ...

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

कॉपी पेस्ट पैटर्न? एएच – Jaster

+0

@ जेस्टर: आपका क्या मतलब है? –

+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]); 
        } 
       } 
     } 
    } 
} 
संबंधित मुद्दे