[英]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 問題。
有些代碼必須使用反射:
反射很慢。 反射中斷編譯時類型檢查。 出於這些原因,我們始終鼓勵您為工作提供明確的、非反射的 function。
在這種情況下,它甚至是一個安全風險。 我記得在我的 PHP 日子里,get 或 put 參數都非常危險,因為如果您忘記初始化它們,攻擊者可以使用它們在您的代碼中設置隨機變量。 SQLInjections 也是一回事。 這段代碼允許攻擊者使用他們想要的任何 arguments 運行幾乎隨機的函數。
我有一個更快的保護程序 - 因為反射免費 - 選項: Dictionary<string, delegate(string)>
。
如果返回類型是可變的,那么也有無反射選項。 但是只要你寫了反射字符串的每一部分,它就沒有安全風險——只是有點慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.