2013-07-11 30 views
1

我想確定返回類型中涉及的字段的列表(本例中是來自類Ob的「string MyName」和「string MyAddress」以及它們各自的文檔字符串)。關於返回類型以獲取字段及其文檔的反思?

我已經到了獲得返回類型的階段,但是我嘗試的任何事情都是給我空值或拋出異常。有什麼建議麼?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Text; 
using System.Threading.Tasks; 

namespace SampleProf 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Sample cl = new Sample(); 
      Type myClType = cl.GetType(); 

      MethodInfo[] methodsInfo = myClType.GetMethods(); 

      List<string> MethodList = new List<string>(); 

      // Iterate through all methods 
      foreach (MethodInfo methodInfo in methodsInfo) 
      { 
       if (methodInfo.IsPublic && methodInfo.Name.Contains("Get") && !methodInfo.Name.Contains("GetType")) 
       { 
        if (methodInfo.ReturnType != typeof(void)) 
        { 
         // Do something here? 
        } 
       } 
      } 

      Console.Read(); 
     } 

    } 

    public class Sample 
    { 
     public Ob GetMe() 
     { 
      return null; 
     } 
    } 

    public class Ob 
    { 
     /// <summary>My name</summary> 
     string MyName; 
     /// <summary>My address</summary> 
     string MyAddress; 
    } 
} 
+0

你試過打印出'methodInfo.ReturnType.Name'嗎? – MarcinJuraszek

+0

是的。我確實得到了這個名字,但是我希望得到這個類「Ob」中的字段。 – Legend

+0

所以你有一個類型,你想得到它的屬性/字段。這是你的實際問題,而且它是一個非常簡單的問題。只要確保使用正確的綁定標誌 –

回答

1

這些是屬性?

對於屬性,這很容易,就像你已經檢索過的方法一樣。

PropertyInfo[] pi = myClType.GetProperties(); 

字段的,這樣的事情(使用按位或爲的BindingFlags參數):

myClType.GetFields(BindingFlags.Public | BindingFlags.NonPublic); 
+0

糟糕 - 我現在看到你已經在代碼的底部定義了Ob。沒有看到。給我一分鐘。 – Cortright

1

我想你要找的是什麼methodInfo.ReturnType.GetFields()

0

一旦你獲得了您可以繼續遍歷數組中的每個元素,查詢MethodInfo.ReturnType屬性以確定每個函數返回的類型。

一旦獲得Type的實例,就很容易反映其中包含的字段並分別打印其類型和名稱。

我用合適的BindingFlags代替了你的繁瑣條件。您不再需要檢查方法是否公開,您也不需要檢查該方法是否被稱爲「GetType」

static void Main(string[] args) 
{ 
    Sample sampleInstance = new Sample(); 
    Type sampleType = sampleInstance.GetType(); 

    MethodInfo[] sampleMethods = 
     sampleType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); 

    foreach (MethodInfo method in sampleMethods) 
    { 
     var methodReturnType = method.ReturnType; 

     if (methodReturnType == typeof(void)) 
      break; 

     Console.WriteLine(methodReturnType.FullName); 

     foreach (FieldInfo field in methodReturnType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) 
     { 
      Console.WriteLine(" {0}: {1}", field.DeclaringType, field.Name);  
     } 
    } 

    Console.Read(); 
} 
+0

選民請解釋。 Upvoted你的時間和一些有用的技術。謝謝。 – Legend

+0

@Legend答案不正確? –

+0

不,這不正確。我只接受科特賴的答案,因爲它是第一個。 – Legend