咨詢區
我的類中有一組私有方法,我現在想根據靈活的輸入值來動态調用其中的私有方法,代碼類似是這個樣子。
MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType);
dynMethod.Invoke(this, new object[] { methodParams });
代碼跑起來後,我發現 dynMethod 并沒有傳回結果,請問我該如何配置才能正确的傳回?
回答區
如果你真的想解決這個問題,個人建議你寫個擴充方法,比如下面這樣。
static class AccessExtensions
{
public static object call(this object o, string methodName, params object[] args)
{
var mi = o.GetType ().GetMethod (methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance );
if (mi != null) {
return mi.Invoke (o, args);
}
return null;
}
}
然後可以這樣使用
class Counter
{
public int count { get; private set; }
void incr(int value) { count += value; }
}
[Test]
public void making_questionable_life_choices()
{
Counter c = new Counter ();
c.call ("incr", 2); // "incr" is private !
c.call ("incr", 3);
Assert.AreEqual (5, c.count);
}
微軟最近修改了 反射API,在新的反射模式和平台下,大概是這麼寫的。
obj.GetType().GetTypeInfo().GetDeclaredMethod("MethodName").Invoke(obj, yourArgsHere);
實踐中最好還是封裝成一個泛型方法,比如下面這樣。
public static object InvokeMethod<T>(this T obj, string methodName, params object[] args)
{
var type = typeof(T);
var method = type.GetTypeInfo().GetDeclaredMethod(methodName);
return method.Invoke(obj, args);
}
注意:
- 如果你需要調用的方法是在 obj 的基類中,那這裡的泛型參數 T 要顯式定義為基類。
- 如果你需要調用的方法是一個異步方法, 你可以使用 await (Task) obj.InvokeMethod(…) 。
點評區
确實微軟已經優化了各種 反射Api,使用起來雖然較慢,但相比以前要好很多了。
文章來源于NET技術問答 ,作者Stackoverflow