2009-09-28 213 views
0

而是調用是否有可能通過方法名

if (somecondition == 1) 
{ 
    int result = new myDelegate(MyClass.myMethod1); 
} 
else 
{ 
    int result = new myDelegate(MyClass.myMethod2); 
} 

一個C#的委託是否有可能使用反射做這樣的事情

int result = new myDelegate("MyClass.myMethod" + i.ToString()); } 
+3

這個代碼不正確,不能委託分配給一個int ... – 2009-09-28 20:08:51

+2

並不重要,但你應該儘量讓你的C#-code看起來像C#-code,所以大括號總是進入下一行等... – 2009-09-28 20:14:06

回答

6
myDelegate dlg = (myDelegate)Delegate.CreateDelegate(typeof(myDelegate), this, "myMethod" + i); 
+0

哇謝謝,雖然裏德科普塞似乎更容易。 – programmernovice 2009-09-28 20:28:40

+0

@programmernovice:您確實要求委託人。 Reed Copsey的回答只是動態調用一種方法,而托馬斯和其他人根據您的請求似乎表明您希望爲您創建一個委託。 – jason 2009-09-28 20:44:11

+0

這種方法的優點是你獲得的委託是一個比每次都通過反射調用要快的順序(或兩個)。這裏只有第一次反射調用(相對)很慢,每次調用它幾乎和普通的方法調用一樣快,而且不夠重要。把它看作緩存反射。 – JulianR 2009-09-28 21:12:23

1

是的,你可以動態調用方法。小樣本:

public class MyClass { 
    public delegate string MyDelegate(); 
    public string MyMethod1() { 
     return "Hello"; 
    } 
    public string MyMethod2() { 
     return "Bye"; 
    } 
} 

int i; 
MyClass myInstance = new MyClass(); 
MethodInfo method = typeof(MyClass).GetMethod("MyMethod" + i.ToString()); 
Delegate del = Delegate.CreateDelegate(typeof(MyClass.MyDelegate), myInstance, method); 
Console.WriteLine(del()); // prints "Hello" or "Bye" contingent on value of i 
+0

你好,謝謝你的完整例子。 – programmernovice 2009-09-28 20:30:33

5

您可以通過反射做到這一點(但我並不推薦它):

string MethodName = "myMethod" + i.ToString(); 
Type type = MyClass.GetType(); 
MethodInfo methodInfo = type.GetMethod(MethodName); 
int result = (int) methodInfo.Invoke(MyClass, null); 
+0

我投票給托馬斯,因爲他先回答了,但我寧願使用你的解決方案,因爲這對我的頭腦更容易。 – programmernovice 2009-09-28 20:29:40

+1

這對我來說並不重要,但是......您可以自由地標記爲答案 - 但通常情況下,您決定使用的那個人的投票就是您要使用的人。先回答(雖然在技術上,我在他之前1分鐘回答,順便說一句)並不意味着回答最好。 :) – 2009-09-28 20:31:12

1

好,只是太渴望這個必要的,但之後我」我已經做了這個,我也要發佈這個;-)

請注意:Reflektion遠遠比使用代表慢!

Type t = typeof(MainClass); 
MethodInfo mi = null; 
int i = 2; 
if (i==1) 
{ 
    mi = t.GetMethod("myMethod" + i.ToString()); 
} 
else 
{ 
    mi = t.GetMethod("myMethod" + i.ToString()); 
} 

if(mi != null) 
{ 
    mi.Invoke(new object(), new object[] {}); 
} 
相關問題