C# 如何向在发出时类型未完成的委托发出调用?

C# 如何向在发出时类型未完成的委托发出调用?,c#,reflection,delegates,invoke,reflection.emit,C#,Reflection,Delegates,Invoke,Reflection.emit,我无法向在发出时类型未完成的委托发出调用。我将详细说明:我声明了以下委托类型: // Delegate type. The 'firstArgument' will be 'this', i.e., this is an open // instance method: the implicit argument is here given explicitly, in // 'firstArgument'. (See link below for explanation on open ins

我无法向在发出时类型未完成的委托发出调用。我将详细说明:我声明了以下委托类型:

// Delegate type. The 'firstArgument' will be 'this', i.e., this is an open
// instance method: the implicit argument is here given explicitly, in
// 'firstArgument'. (See link below for explanation on open instance delegates).
public delegate Object DirectReadAccessor<T>(T firstArgument);
其中invokeMInfo是DirectReadAccessor上的方法Invoke,我应该这样获得:

MethodInfo invokeMInfo = typeof(DirectReadAccessor<MyClass>).GetMethod(
        "Invoke",                        // Name of the method.
        BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, // Binding attributes.
        null,                            // Binder.
        new Type[] { typeof(MyClass) },  // Types of the arguments.
        null                             // Modifiers for the arguments.
);
事实上,在这种情况下,我没有得到例外。但是,我需要能够在完成类型之前获取Invoke方法的MethodInfo,同时为InitializeClass发出代码

这是一种奇怪的情况:当我需要委托时,我会得到它,但我无法生成调用它的代码。有人能帮忙吗


非常感谢,非常抱歉这篇冗长的文章。

您是否尝试过编译通用代码并使用ILDASM查看它?它应该向您显示正确的IL,并希望显示要生成的正确的emit。

最小化生成的类中的代码量是否有意义


我的意思是,生成的类可以实现一个接口来访问其数据。通过它,您可以实现可以用C#而不是IL编码的附加功能。

这是一个棘手的问题。我认为您应该能够使用
TypeBuilder.GetMethod
来获取所需的
MethodInfo
,使用以下方法调用

TypeBuilder.GetMethod(directReadAccessorType, 
    typeof(DirectReadAccessor<>).GetMethod("Invoke"));
TypeBuilder.GetMethod(directReadAccessorType,
typeof(DirectReadAccessor.GetMethod(“Invoke”);

恕我冒犯,但这只是我的问题,还是开发人员编写的代码太复杂了?!?没有人拿。这是一个为期5个月的项目,试图移植到C#这是一个预先存在的系统,从一开始就相当复杂。实际上,我在这里尝试做的事情并没有那么复杂,我只是有一组委托,希望能够调用它们,仅此而已。唯一的问题是,我使用的是动态创建的类型,但是如果不允许使用此类类型,那么首先提供该功能有什么意义呢?嗨。是的,我在上面说“显然我需要的是下面的发射”,发射是按照你的建议获得的。问题是我认为我可以在运行时将委托加载到堆栈上(我这样做),并按原样调用它,而不必在发出代码时为委托的类型提供特定的调用方法(因为类型还不存在)。您好。问题在于,这是一个系统,它接受用户编写的类(在本例中是应用程序程序员)并使用一些功能对它们进行扩展,最重要的是确保对字段的访问是安全的(通过数组directReadAccessors中我拥有的访问器的委托)。所有这些都必须自动完成,我不想强迫用户编写接口等等。我必须通过动态地发出类来完成所有这些。如果你对如何做得更好有任何想法,请让我知道。谢谢我不确定我是否理解您的要求(似乎应用程序程序员应该能够用一种方法实现接口),但解决这个问题的另一种方法可能是生成C#,并通过调用csc编译它,然后加载生成的DLL。或者提供一个构建步骤或脚本,让应用程序程序员引用这个生成的DLL。“这是一个接受用户编写的类的系统”-shiversI确信他们能够实现它,我只是不希望他们改变他们的代码比我必须做的更多。但是kvb已经解决了我的问题,所以不用担心!谢谢你的建议!哦,天哪,就是这样。它起作用了!非常感谢,我已经为此挣扎了好几天了!(这真的令人沮丧;我很难找到我需要的图书馆电话,就像这一个)。再次感谢你,你真的让我开心@阿利克斯-我很高兴能帮上忙。不幸的是,
TypeBuilder
上的静态
GetMethod
GetField
GetConstructor
方法不是很容易发现,因此在使用反射.Emit和泛型执行复杂操作时很容易卡住。请告诉我:)。我已经编程多年了(虽然不是用C语言),通常我不需要在论坛上问太多问题,但自从几周前我开始使用C语言以来,我不得不问很多问题。诚然,我尝试做的一些事情有点不同寻常:)
MethodInfo invokeMInfo = typeof(DirectReadAccessor<MyClass>).GetMethod(
        "Invoke",                        // Name of the method.
        BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, // Binding attributes.
        null,                            // Binder.
        new Type[] { typeof(MyClass) },  // Types of the arguments.
        null                             // Modifiers for the arguments.
);
directReadAccessorType = typeof(DirectReadAccessor<>).MakeGenericType(typeBuilder);
typeBuilder.CreateType();
TypeBuilder.GetMethod(directReadAccessorType, 
    typeof(DirectReadAccessor<>).GetMethod("Invoke"));