2011-03-06 20 views
3

我想在RunTime上創建一個方法。 我希望用戶輸入一個字符串,該方法的名稱將爲DynamicallyDefonedMethod _ ####(以用戶字符串結尾)。使用用戶定義的名稱創建新方法。反思C#

我想相同的字符串在方法體被包埋: 它將調用StaticallyDefinedMethod(####,A,B)

喜歡的東西:

public MyClass1 DynamicallyDefonedMethod_#### (int a, int b) 
{ 
return StaticallyDefinedMethod (####, a, b) 
} 

的想法是,用戶將在運行時創建一個新的方法,然後調用它(帶有a,b參數)。

我使用C#反射,但發現沒有簡單的方法做到這一點。 有人知道如何做到這一點嗎?

問候,

回答

2

如前所述(評論)中,容易方法就是使用lambda:

Func<int,int,Whatever> func = (a,b) => StaticallyDefinedMethod(s,a,b); 

,但你也可以使用元編程這個(下圖)。在這裏,您可以控制方法名稱,並具有更大的靈活性(並非您在此需要)。但是請注意,這並不是真的添加一種方法的類型 - 動態方法是分開的和斷開的。你不能真的在運行時將成員添加到類型。

using System; 
using System.Reflection.Emit; 
public class MyClass1 { 
    static void Main() 
    { 
     var foo = CreateMethod("Foo"); 
     string s = foo(123, 456); 
     Console.WriteLine(s); 
    } 
    static Func<int,int,string> CreateMethod(string s) 
    { 
     var method = new DynamicMethod("DynamicallyDefonedMethod_" + s, 
      typeof(string), 
      new Type[] { typeof(int), typeof(int) }); 
     var il = method.GetILGenerator(); 
     il.Emit(OpCodes.Ldstr, s); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Ldarg_1); 
     il.EmitCall(OpCodes.Call, typeof(MyClass1).GetMethod("StaticallyDefinedMethod"), null); 
     il.Emit(OpCodes.Ret); 
     return (Func<int,int,string>)method.CreateDelegate(typeof(Func<int, int, string>)); 
    } 
    public static string StaticallyDefinedMethod(string s, int a, int b) 
    { 
     return s + "; " + a + "/" + b; 
    } 
} 

這裏最後一個想法可能是使用dynamic,但它是很難在運行時選擇的名稱與dynamic

相關問題