IL:如何生成特定的C#函数?

IL:如何生成特定的C#函数?,c#,dynamic,il,C#,Dynamic,Il,我需要动态生成这样的类: public class SomeProxyClass { public Action<some_vars> ActionName; public rettype InvokeActionName(some_vars) { if(this.ActionName != null) { return this.ActionName(some_vars); }

我需要动态生成这样的类:

public class SomeProxyClass
{
    public Action<some_vars> ActionName;
    public rettype InvokeActionName(some_vars)
    {
        if(this.ActionName != null)
        {
            return this.ActionName(some_vars);
        }
        return default(rettype);
    }
}
public class SomeClass
{
    public static SomeProxyClass parentProxy;
    public static rettype ActionName(some_vars)
    {
        this.parentProxy.InvokeActionName(some_vars);
    }
}
公共类SomeProxyClass
{
公共行动名称;
public rettype InvokeActionName(一些变量)
{
if(this.ActionName!=null)
{
返回此.ActionName(一些变量);
}
返回默认值(rettype);
}
}
公共类
{
公共静态SomeProxyClass parentProxy;
公共静态rettype ActionName(一些变量)
{
this.parentProxy.InvokeActionName(一些变量);
}
}
我的主要问题是,我不知道如何用IL指令生成如此简单的方法,所以我正在寻求您的帮助!
提前谢谢你

注意:
操作
不返回值。因此,
返回此值。如果您希望返回值,ActionName(某些变量)
将无效

以下是我的想法,希望能有所帮助:)

公共类SomeProxyClass
{
公共职能行动名称;
公共可为Null的InvokeActionName(I值)
{
if(this.ActionName!=null)
{
返回此.ActionName(值);
}
返回null;
}
}
公共类
{
公共静态SomeProxyClass parentProxy=新的SomeProxyClass();
公共静态int?ActionName(字符串值)
{
this.parentProxy.InvokeActionName(值);
}
}

如果要动态生成类,可以使用CodeDom或Reflection.Emit。CodeDom动态创建C#代码,然后对其进行编译,而Reflection.emit为代码创建MSIL。如果你想在IL中写东西,你可以像平常一样创建这个类,然后使用
ILDASM.exe
将你的类反编译成IL。现在您已经知道了IL中的代码应该是什么样子,您可以使用Reflection.emit
s
ILGenerator`class动态生成类。有关分步流程,请参阅本文:


希望它对您有所帮助。

使用反编译器,例如ILSpy,您可以看到IL指令,然后利用反射发射就不难了。非常有用,我将对此进行研究。问题是,我需要用动态名称、变量、返回类型等动态地创建这样的函数、动作等。
public class SomeProxyClass<I,O>
{
    public Func<I, Nullable<O>> ActionName;
    public Nullable<O> InvokeActionName(I value)
    {
        if(this.ActionName != null)
        {
            return this.ActionName(value);
        }
        return null;
    }
}

public class SomeClass
{
    public static SomeProxyClass<string, int> parentProxy = new SomeProxyClass<string, int>();
    public static int? ActionName(string value)
    {
        this.parentProxy.InvokeActionName(value);
    }
}