2017-03-08 1 views
-1

Ich habe die dynamischen Webdienste für SOAP und REST geschrieben. Jetzt müssen Sie OData-Webdienste erstellen, die über Vorgänge verfügen, die IQueryable Interface gemäß WCF-Datendienstspezifikation zurückgeben. Ich erstelle eine dynamische Methode basierend auf IL Emit-Anweisungen. Ich bin jedoch nicht in der Lage, den Rückgabetyp dem MethodBuilder zuzuordnen, der IQueryable ist.Erstellung einer dynamischen Methode mit CIL MethodBuilder mit IQueryable <DynamicType> Rückgabetyp

Um spezifisch zu sein, kann ich den Rückgabeparameter nicht mit MethodBuilder.SetReturnType-Methode festlegen, da der Rückgabetyp IQueryable zur Laufzeit generiert wird.

public class MainClass 
    {  

    public static void Main() 
      { 
       AssemblyBuilder serviceAsmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("MyDynamicAsm"), AssemblyBuilderAccess.RunAndSave); 
       ModuleBuilder serviceModule = serviceAsmBuilder.DefineDynamicModule("MyDynamicAsm", "MyDynamicAsm.dll"); 
       TypeBuilder serviceTypeBuilder = serviceModule.DefineType("MyDynamicType", TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass, 
        typeof(DataService<WebServerResult>)); 

       //This is the problem, as I do not have this class at compile 
       //time. I get this class at run time     
       Type returnType = typeof(IQueryable<WebServerResult>); 
       MethodBuilder MethodBldr = serviceTypeBuilder.DefineMethod("OperationName", MethodAttributes.Public, returnType, Type.EmptyTypes); 
       ILGenerator methodGenerator = MethodBldr.GetILGenerator(); 
       methodGenerator.Emit(OpCodes.Ret); 
      } 
     } 
     //This is just for reference. This code does not exist at design time 
     [DataContract] 
     public class WebServerResult 
     { 
      [DataMember] 
      public List<Variable> Variables { get; set; } 
      public IQueryable<Variable> ODataResultList 
      { 
       get { return Variables.AsQueryable<Variable>(); } 
      } 
     } 

     [DataServiceKey("VariableName")] 
     [DataContract(Namespace = "")] 
     public class Variable 
     { 
      [DataMember] 
      public string VariableName { get; set; } 
      [DataMember] 
      public string VariableValue { get; set; } 
      [DataMember] 
      public string VariableType { get; set; } 
     } 

Kann mir jemand den Blue Print der Methodengeneration im IL-Code zur Verfügung stellen?

+0

Mögliche Duplikat [Dynamische Methode Method mit IQueryable Rückgabetyp] (http://stackoverflow.com/questions/42654679/dynamic-method-using-methodbuilder-with- iqueryabledynamictype-return-type) – thehennyy

+0

Bitte machen Sie den Downvote rückgängig .. Ich kann keine neuen Fragen stellen .. Ich habe meinen ursprünglichen Beitrag gelöscht – badari

+0

Ich habe nicht gewählt. Wie auch immer, frag die gleiche Frage hier nochmal. Was ist noch unklar? Sie müssen nur Ihr Typobjekt als einzigen Parameter an die SetReturnType-Methode übergeben. – thehennyy

Antwort

2

Um einen generischen Typ zu erstellen, der bis zur Laufzeit unbekannte Typparameter enthält, müssen Sie die Methode Type.MakeGenericType verwenden. Der Code könnte wie folgt aussehen:

//get the dynamic type from somewhere 
Type unknownType = ...; 

//get open generic base type 
Type openGeneric = typeof(IQueryable<>); 

//create closed generic type with the unknown type as generic type parameter 
Type closedGeneric = openGeneric.MakeGenericType(unknownType); 

//use the closed type for whatever you want 
Type returnType = closedGeneric; 
Verwandte Themen