Warum generiert ein generierter TypeBuilder generic methodinfo keine generische Methode?

9

Ich habe Code, der MethodInfo einer generischen Methode verwendet, die für einen generierten Typ gefunden wurde. Um einige Überlegungen zu vermeiden, verwende ich den Code mit dem

%Vor%

Muster zum Generieren der MethodInfos zur Kompilierzeit.

Wenn die methodInfo jedoch zu einem generischen Typ gehört und selbst eine generische Methode ist, werden die Dinge verrückt. Hier ist ein Code, der einfach einen GM erzeugt, der eine offene Version seiner methodInfo ausgibt. Wenn ich es aufrufen, um die Methode abzurufen, anstatt zu versuchen, sie über einen bestimmten Typ zu schließen, bekomme ich eine verblüffende Ausnahme ::

  

System.Reflection.MethodInfo GM[M]() ist keine GenericMethodDefinition. MakeGenericMethod darf nur für eine Methode aufgerufen werden, für die MethodBase.IsGenericMethodDefinition den Wert true hat.

Hier ist der relevante Code ::

%Vor%

Es scheint, das einzige Mal, dass mein Code versaut ist, wenn es sich um eine generische Methode eines nicht-generischen Typs handelt. Wenn der Code so umgeschrieben wird, dass er eine normale Methode für einen normalen Typ oder eine generische Methode für einen normalen Typ oder eine normale Methode für einen generischen Typ darstellt, funktioniert alles. Es ist nur die Kombination von beiden, die Fehler verursacht. Mache ich etwas falsch?

Ich habe einen Fehler zu diesem Problem gesendet: Ссылка

    
Michael B 07.01.2013, 16:52
quelle

2 Antworten

3

Sieht für mich wie ein CLR-Problem aus, weil das Gleiche passiert, wenn Sie die IL manuell schreiben und ilasm verwenden. Das heißt, bei einer generischen Klasse G und einer nicht generischen Klasse N mit jeweils einer generischen Methode M , dann versucht man, die generische Methodendefinition aus der nicht-generischen Klasse zu bekommen:

%Vor%

aber das von der generischen Klasse zurückgegebene MethodInfo ist keine generische Methodendefinition (aber es ist fast; es ist D.MakeGenericMethod(D.GetGenericArguments()) , wobei D die gewünschte Methodendefinition ist):

%Vor%     
kvb 07.01.2013, 19:28
quelle
0

Das Problem liegt in der Anweisung ldtoken method , da die CLR aufgrund der Unfähigkeit von IL, generische Methodendefinitionen auszudrücken, die falsche Methode lädt. Der Befehl wird von ildasm zu diesem dekompiliert:

%Vor%

Was nicht einmal IL ist. Die CLR verwirft dann die Anweisung und lädt stattdessen eine generische Methodeninstanziation aus ihren eigenen generischen Parametern.

%Vor%

Für weitere Tests habe ich einen kürzeren Code erstellt, der das gleiche Problem zeigt:

%Vor%

GetMethodFromHandle (was auch nur den Methoden-Handle, nicht den Deklarationstyp benötigt) setzt nur den Deklarationstyp (notice <int> oder <string> spielt keine Rolle) und macht nichts falsch.

    
IllidanS4 06.04.2015 13:06
quelle

Tags und Links