यह पता लगाने के लिए कि MyClass.Foo()
विधि का उपयोग करने के लिए, आपको उन सभी असेंबली के सभी वर्गों का विश्लेषण करना होगा जिनमें MyClass
शामिल असेंबली का संदर्भ है। मैंने इस कोड को कैसा दिख सकता है इस बारे में अवधारणा का एक सरल सबूत लिखा है।मेरे उदाहरण में मैं this library इस्तेमाल किया (यह सिर्फ a single .cs file है) जेबी Evain द्वारा लिखित:
मैं विश्लेषण करने के लिए एक छोटे से परीक्षण वर्ग ने लिखा है:
public class TestClass
{
public void Test()
{
Console.WriteLine("Test");
Console.Write(10);
DateTime date = DateTime.Now;
Console.WriteLine(date);
}
}
और मैं सभी TestClass.Test()
भीतर इस्तेमाल किया तरीकों का प्रिंट आउट के लिए इस कोड लिखा था :
System.Console.WriteLine(System.String value);
System.Console.Write(System.Int32 value);
System.DateTime.get_Now();
System.Console.WriteLine(System.Object value);
012:
MethodBase methodBase = typeof(TestClass).GetMethod("Test");
var instructions = MethodBodyReader.GetInstructions(methodBase);
foreach (Instruction instruction in instructions)
{
MethodInfo methodInfo = instruction.Operand as MethodInfo;
if(methodInfo != null)
{
Type type = methodInfo.DeclaringType;
ParameterInfo[] parameters = methodInfo.GetParameters();
Console.WriteLine("{0}.{1}({2});",
type.FullName,
methodInfo.Name,
String.Join(", ", parameters.Select(p => p.ParameterType.FullName + " " + p.Name).ToArray())
);
}
}
यह मुझे निम्न उत्पादन दे दी है
यह उदाहरण स्पष्ट रूप से पूर्ण से दूर है, क्योंकि यह रेफरी और आउट पैरामीटर को संभाल नहीं करता है, और यह सामान्य तर्कों को संभाल नहीं करता है। मुझे यकीन है कि अन्य विवरणों के बारे में भी भूल गए हैं। यह सिर्फ दिखाता है कि यह किया जा सकता है।
स्रोत
2011-03-30 18:27:09
क्या आपको विधि में केवल स्थिर कॉल का पता लगाने की आवश्यकता है? प्रतिबिंब और प्रतिबिंब एमिट के साथ कॉल करना चाहिए पता भी? –
और यह काम गैर-प्रबंधित कोड के साथ होना चाहिए? सभी डीएलएल प्रतिबिंब का समर्थन नहीं करते हैं। –
@ डारिन: वे केक पर आइसिंग करेंगे, लेकिन आवश्यक नहीं हैं। @ जेम्स: मुझे नहीं लगता कि मुझे गैर-प्रबंधित कोड के बारे में चिंता करने की ज़रूरत है। मैं उन डीएलएस पर ऐसा कैसे कर सकता हूं जो प्रतिबिंब का समर्थन नहीं करते हैं? – user420667