2011-01-27 21 views
8

मैं रनटाइम असेंबली लोड कर रहा हूं, लेकिन मुझे किसी वर्ग या विधियों के नाम नहीं पता हैं। मैं अपनी असेंबली में सभी कक्षाओं को उनकी घोषित विधियों के साथ सूचीबद्ध नहीं करना चाहता, न कि सिस्टम से प्राप्त। ऑब्जेक्ट।रनटाइम असेंबली लोड करते समय, मैं केवल घोषित विधियों को कैसे ढूंढूं?

public class component01 
{  
    public string myName = "component01"; 
    public string getMyName() 
    { 
     return myName; 
    } 
} 

public class component02 
{  
    public string myName = "component02"; 

    public string getMyName() 
    { 
     return myName; 
    } 
} 

परिणाम:

component01 
component02 

And if i remove the bindingflag: 

component01 
    getMyName 
    ToString 
    Equals 
    GetHashcode 
    GetType 
component02 
    getMyName 
    ToString 
    Equals 
    GetHashcode 
    GetType 

मैं केवल getMyName विधि से पता चला चाहते

string str = ""; 
Assembly assembly = Assembly.LoadFile(@"c:\components.dll");  

foreach (Type type in assembly.GetTypes()) 
{ 
    if (type.IsClass == true) 
    {  
     str += type.Name + "\n";  
     MethodInfo[] methodInfo = type.GetMethods(BindingFlags.DeclaredOnly); 

     foreach (MethodInfo mi in methodInfo) 
     {  
      str += "\t" + mi.Name + "\n";  
     }  
    } 
} 

MessageBox.Show(str); 

यह components.dll है:

इस कोड है।

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly 

आप अपनी आवश्यकताओं पर निर्भर करता है BindingFlags.NonPublic में डालने के लिए और साथ ही, कर सकते हैं:

उत्तर

9

मैं तुम्हें झंडे की तलाश कर रहे है।

मैं यह भी इंगित करता हूं कि गहन विरासत पदानुक्रमों के साथ, प्रकार सेSystem.Object के अलावा सदस्यों का उत्तराधिकारी हो सकते हैं। आप उन रखना चाहते हैं, लेकिन नहीं लोगों को मूल रूप से object पर घोषित हैं, तो आप कर सकते थे:

  1. GetMethods कॉल के लिए BindingFlags.DeclaredOnly ध्वज निकालें। आप एक अलग फिल्टर की आवश्यकता हो सकती है, तो "घोषित" की अपनी परिभाषा विधि और अधिक जटिल थे,

    methodInfo.GetBaseDefinition().DeclaringType != typeof(object) 
    
बेशक

:

  • केवल जिसके लिए तरीकों में शामिल हैं।

  • +1

    पूरी तरह से काम करता है, धन्यवाद! मैंने पहले सार्वजनिक और घोषित दोनों का उपयोग करने की कोशिश की, लेकिन यह काम नहीं किया। मुझे तीनों को निर्दिष्ट करने की आवश्यकता कैसे है? – Bildsoe

    +0

    @ बिल्डसो: 'System.Reflection.BindingFlags' एक झंडे-enum है। जब 'इंस्टेंस' ध्वज सेट नहीं होता है, तो' GetMethods' में इंस्टेंस विधियों को शामिल नहीं किया जाता है। – Ani

    +1

    ठीक है, धन्यवाद। मैंने सोचा कि, यदि विधि का उल्लेख किया गया था तो इसमें शामिल होगा। – Bildsoe