2010-04-13 74 views
0

我知道由於元數據,.NET程序集是自描述性的。現在假設我有一個我一無所知的黑盒子裝配。我能找出其中包含的類型並使用它們的方法並傳遞參數嗎?怎麼樣? Sampe代碼片斷將深受讚賞。如何在「黑盒子」.NET程序集中使用類型?

[新編輯1]

我在設計時不工作。我想弄清楚一個類型的方法需要多少個參數以及這些參數是什麼類型,所以我可以在運行時使用反射來調用該方法。

[新編輯2]

我想出了以下代碼片段。它從黑盒子組件構建一個對象。但它看起來相當醜陋,有什麼更好的主意?

 foreach (ConstructorInfo ci in cis) 
     { 
      Console.WriteLine("{0}:{1}", ci.MemberType, ci.Name); 
      Console.WriteLine("ReflectedType:{0}", ci.ReflectedType); 
      ParameterInfo[] parameters = ci.GetParameters(); 
      Object[] arguments = new Object[parameters.Length]; 
      Console.WriteLine(parameters.Length); 
      for (int i = 0; i < parameters.Length;i++) 
      { 
       ParameterInfo para = parameters[i]; 
       if (para.ParameterType == typeof(Int32)) 
       { 
        Console.WriteLine("please input a Int32"); 
        String input = Console.ReadLine(); 
        Int32 para_int32 = Int32.Parse(input); 
        arguments[i] = para_int32; 
       } 

       if (para.ParameterType == typeof(String)) 
       { 
        Console.WriteLine("please input a String"); 
        String para_String = Console.ReadLine(); 
        arguments[i] = para_String; 
       } 

       //Add all the guesses... 
      } 
      Object o = ci.Invoke(arguments); 

非常感謝。

+1

如果一個.NET程序集是自描述性的,你怎麼能有一個「黑盒子」的.NET程序集? – 2010-04-13 07:53:17

+0

by black-box,我的意思是我沒有任何伴隨文件,對其內部類型一無所知。實際上,我只是在做一些關於如何使用Reflection來查找程序集中的方法並調用它們的實驗。 – smwikipedia 2010-04-13 08:16:36

+0

這沒有任何意義。你無法猜測正確的參數值。而且你不想調用「FormatHardDrive()」。 – 2010-04-13 11:13:29

回答

4

我建議你看看Reflection的主題,它可以讓你在運行時探索元數據。當然,如果你只對設計時間感興趣,那麼IDE會讓你探索相關的命名空間。

0

那麼,如果你需要在運行時的數據,那麼你最好善於Reflection

我建議你閱讀this page at least.

例子:

void doSomething(object obj) 
{ 
    Type type = obj.GetType(); 
    foreach(MemberInfo mi in type.GetMembers()) 
    { 
     //print the data or work on it. 
    } 
} 
+0

這可能也需要! :) 鏈接 - > http://www.vcskicks.com/new-instance.php – Nayan 2010-04-13 09:20:23

相關問題