簡體   English   中英

如何在 C# 中動態獲取 Function 形式參數列表?

[英]How to get Function formal parameters' list dynamically in C#?

我有一個 class 文件,我試圖通過傳遞 function 的名稱來讀取另一個函數的形式參數。
但不知何故,下面的代碼不起作用:

public string Post([FromBody]string value)
{
    string result = String.Empty;
    JObject json = JObject.Parse(value);
    string funcname = json["functionname"].Value<string>();

        method.Method.GetParameters ( ) [ index ].Name ;

    //typeof(MyType).GetMethod(json).Invoke(null, new [] {arg1, arg2}) //need to parameter list here
    //GetSearch(string text)

    return result;
}

這可以通過反射實現嗎? 還是使用 Realproxy?

您可以將反射用作:

var type = typeof(T);
var method = type.GetMethod(methodName);
var parameters = method.GetParameters();

其中T是您的 class 類型。 您可以從每個ParameterInfo object 中獲取您需要的數據。

檢索以變量funcname的值命名的 Method 的MethodInfo后,

MethodInfo mInfo = typeof(MyType).GetMethod(funcname);

我建議您將要使用的參數名稱及其對應的值存儲到Dictionary中,例如:

Dictionary<string, object> parameterValues = new Dictionary<string, object>()
{
    { "id", 3 },
    { "name", "John" },
    { "size", 1.00 }
};

然后只需循環MethodInfo.GetParameters()並將具有匹配名稱的參數值添加到對象列表中。

var invokingParemeters = new List<object>();

foreach (var parameter in mInfo.GetParameters())
{
    if (parameterValues.ContainsKey(parameter.Name))
    {
        invokingParemeters.Add(parameterValues[parameter.Name]);
    }
}

最后,將此列表傳遞給.Invoke()

mInfo.Invoke(null, invokingParemeters.ToArray());

對於所述問題,解決方案確實是反思。 但是我不喜歡使用反射。 對我來說,這是一種后備,我應該盡量避免。 要求它通常表明存在 XY 問題。

有些代碼必須使用反射:

  • (de)serialisation 必須讓我們反思,以獲取/放入所有元素
  • 用於比較您為相等性制作的兩個結構的代碼必須使用反射,否則它不能在您提出的任何隨機結構上工作。 所有existign 結構都傾向於覆蓋這些功能。
  • 實體框架必須使用反射來生成其屬性只能在查詢后(在運行時)知道的類。

反射很慢。 反射中斷編譯時類型檢查。 出於這些原因,我們始終鼓勵您為工作提供明確的、非反射的 function。

在這種情況下,它甚至是一個安全風險 我記得在我的 PHP 日子里,get 或 put 參數都非常危險,因為如果您忘記初始化它們,攻擊者可以使用它們在您的代碼中設置隨機變量 SQLInjections 也是一回事 這段代碼允許攻擊者使用他們想要的任何 arguments 運行幾乎隨機的函數

我有一個更快的保護程序 - 因為反射免費 - 選項: Dictionary<string, delegate(string)>

  • Key 是要調用的 function 的名稱。
  • 委托是 function,它被賦予 JSON,解析它,然后調用 Function。
  • 如果有人查詢允許的功能? 只需給他 KeyCollection
  • 需要一個新條目? 這是集合初始化的一行
  • 有人給你一把不在收藏中的鑰匙嗎? 無效的論點

如果返回類型是可變的,那么也有無反射選項。 但是只要你寫了反射字符串的每一部分,它就沒有安全風險——只是有點慢。

暫無
暫無

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

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