2009-12-08 99 views
16

如何獲取parms的值(在使用反射的循環中)。 在前面的問題中,有人向我展示瞭如何使用反射來遍歷parms。C#使用反射獲取parms的值

static void Main(string[] args) 
{ 
    ManyParms("a","b","c",10,20,true,"end"); 
    Console.ReadLine(); 
} 

static void ManyParms(string a, string b, string c, int d, short e, bool f, string g) 
{ 
    var parameters = MethodBase.GetCurrentMethod().GetParameters(); 
    foreach (ParameterInfo parameter in parameters) 
    { 
     string parmName = parameter.Name; 
     Console.WriteLine(parmName); 
     //Following idea required an object first 
     //Type t = this.GetType(); 
     //t.GetField(parmName).GetValue(theObject)); 

    } 
} 

如果你一定要知道我爲什麼要這麼做,請在這裏看到: .NET Reflection of all method parameters


感謝所有 - 這似乎是在Python,Perl,PHP中,這會很容易。
即使它可能不是反射,如果我使用反射來獲取字段名稱,似乎會有一個簡單的動態方法來獲取基於名稱的值。 我還沒有嘗試過AOP(Aspect Oriented Programming)的解決方案。 這是其中一件事,如果我不能在一兩個小時內做到這一點,我可能不會這樣做。

+0

也許事情就可以由通過反射檢查,當你使用一個IEnumerable所生成的狀態機來完成?只是一個想法,我不知道如何實現自己:-)(今天因爲一個重複的問題在這裏評論) – Jbjstam 2016-10-10 16:40:07

回答

19

你不能,基本上 - 至少沒有掛鉤到debugger/profiling API

在理論上有可能StackFrame類暴露參數值的一些方法,但它不會 - 我懷疑,爲了做到這一點,你必須刪除一些的優化。

4

你不能通過反思,你不應該這樣做。

如果您需要此類功能,請使用代理服務器,例如,通過RealProxy實現攔截您的呼叫。然後,您可以在實際撥打電話之前檢查並修改任何參數(甚至根本不會進行原始呼叫,這取決於您)。

+0

如果我有更多的時間,我會研究這個。如果你看到我上面引用的帖子,我正在使用微軟主機集成服務器,特別是HIP--並且不確定代理如何與這些人玩。 – NealWalters 2009-12-08 16:38:29

4

你不能那樣做。反射對編譯期間嵌入的元數據起作用,並且此時參數值未知。

+4

但是,您可以使用反射來獲取對象中的屬性值 - 這些值在編譯時不爲人知。 – NealWalters 2009-12-08 22:54:28

4

您是否考慮過使用AOP,比如PostSharp

它可以在您的方法執行之前訪問參數值,因此您的代碼將被簡化爲可重用的屬性類,並且應用於需要進行此檢查的方法的屬性。

2

您無法使用反射來獲取方法參數的值。因爲反射返回元數據信息。如果你想獲得特定字段或屬性的價值,你也需要使用一個實例(就像你已經知道的那樣)。

有幾種方法可以使用.NET框架的內部管道獲取參數值 - 即Profiler API和調試器API。

您可以使用AOP來處理您正在嘗試執行的操作,還有一個名爲CThru的Codeplex項目可能會幫助您 - 使用CThru,您可以在調用方法時攔截方法並獲取調用的參數。

32

你可以通過在你的方法中創建一個匿名類型並利用投影初始器來解決這個問題。然後,您可以使用反射來詢問匿名類型的屬性。例如:

static void ManyParms(
    string a, string b, string c, int d, short e, bool f, string g) 
{ 
    var hack = new { a, b, c, d, e, f, g }; 

    foreach (PropertyInfo pi in hack.GetType().GetProperties()) 
    { 
     Console.WriteLine("{0}: {1}", pi.Name, pi.GetValue(hack, null)); 
    } 
} 
+5

這需要您更改方法的內容。如果你打算這麼做,你可以只報告這些值。這個語法使得它稍微容易一些,但我懷疑它會真正幫助OP。 – 2009-12-08 17:40:33

+0

@Jon:當然,你說得對,但是這比鍵盤輸入少很多,因爲沒有像Console.WriteLine(「a:」+ a)這樣的多重硬編碼行。 ,錯誤的可能性要小得多。 – LukeH 2009-12-08 17:49:36

+2

這是一個很棒的工作環境 – Serge 2013-06-18 10:02:17