簡體   English   中英

C#使用反射獲取參數的值

[英]C# Getting value of params using reflection

如何獲取 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(面向方面​​編程)的解決方案。 這是如果我不能在一兩個小時內完成的事情之一,我可能不會做。

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

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));
    }
}

你不能,基本上 - 至少在沒有掛鈎調試器/分析 API 的情況下不能

從理論上講, StackFrame可能會以某種方式公開參數值,但事實並非如此 - 我懷疑為此,您必須刪除一些優化。

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

如果您需要這種功能,請使用代理,例如通過 RealProxy 實現來攔截您的調用。 然后,您可以在進行實際調用之前檢查和修改任何參數(甚至根本不進行原始調用,這取決於您)。

你有沒有考慮過使用 AOP,比如PostSharp

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

你不能這樣做。 反射適用於編譯期間嵌入的元數據,當時參數值未知。

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

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

您可以將 AOP 用於您想要做的事情,有一個名為CThru的 Codeplex 項目可能會對您有所幫助 - 使用 CThru 您可以在調用方法時攔截該方法並獲取調用它的參數。

PostSharp 診斷工具包支持 IncludeParameterValue 選項。

如果您想了解更多詳細信息以創建小型轉儲,

請參閱使用 MDbgEngine 和 PADRE 訪問堆棧跟蹤創建自定義 PostSharp 方面(使用 IL 轉換)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM