我想調用一個使用反射的方法。MethodInfo.Invoke參數順序
事情是這樣的:
method.Invoke(instance, propValues.ToArray())
的問題是,沒有辦法保證的參數數組在正確的順序。有沒有一種方法來具體哪些值按名稱參數?或者我真的必須製作一個自定義聯編程序?如果是這樣,任何人都可以引導我在正確的方向嗎?
我想調用一個使用反射的方法。MethodInfo.Invoke參數順序
事情是這樣的:
method.Invoke(instance, propValues.ToArray())
的問題是,沒有辦法保證的參數數組在正確的順序。有沒有一種方法來具體哪些值按名稱參數?或者我真的必須製作一個自定義聯編程序?如果是這樣,任何人都可以引導我在正確的方向嗎?
有沒有一種方法來具體哪些值按名稱參數?
那麼,你可以按參數順序指定它們。因此,如果您想要將特定值映射到特定名稱,則應該使用method.GetParameters
獲取參數列表並以這種方式映射它們。例如,如果您有相關的參數Dictionary<string, object>
:
var arguments = method.GetParameters()
.Select(p => dictionary[p.Name])
.ToArray();
method.Invoke(instance, arguments);
編輯:這個答案集中在參數類型不是參數名稱。如果代碼被混淆(或者具有不同的參數名稱),那麼很難映射Jon Skeet提供的解決方案。
反正我已經玩這個有很多....這是最適合我(不知道名字PARAM):
public object CallMethod(string method, params object[] args)
{
object result = null;
// lines below answers your question, you must determine the types of
// your parameters so that the exact method is invoked. That is a must!
Type[] types = new Type[args.Length];
for (int i = 0; i < types.Length; i++)
{
if (args[i] != null)
types[i] = args[i].GetType();
}
MethodInfo _method = this.GetType().GetMethod(method, types);
if (_method != null)
{
try
{
_method.Invoke(this, args);
}
catch (Exception ex)
{
// instead of throwing exception, you can do some work to return your special return value
throw ex;
}
}
return result;
}
所以,你可以調用上面的函數:
object o = CallMethod("MyMethodName", 10, "hello", 'a');
以上的通話將應該能夠調用此方法相匹配的簽名:
public int MyMethodName(int a, string b, char c) {
return 1000;
}
請注意他上面的例子在'this
'
如果存在多個具有相同類型的參數,但您仍然會被破壞... – 2012-07-17 18:06:19
即使有相同的類型,也會調用正確的方法。相信我,你應該嘗試一下。 – KMX 2012-07-17 19:21:05
重讀您的答案後,我相信您完全錯過了這個問題的要點。你給出的例子有正確順序的參數。 OP的全部問題是參數*不一定按照正確的順序排列。他已經有了正確的方法,但他不知道如何傳遞參數,以便它們與參數一致。 – 2012-07-17 19:25:27
範圍內我不能使用它,因爲有關ASP.NET MVC框架的一些複雜性。但是,這100%回答了這個問題。謝謝! – Pluc 2012-07-17 17:55:34
我試過這種方法,但不斷收到「給定的密鑰不在字典中。」 我錯過了什麼? – Jacques 2014-07-10 07:59:55
@Jacques:那麼,這將表明有一個參數,你沒有在你的字典中指定... – 2014-07-10 08:04:35