2017-03-08 6 views
-1

SOAPとRESTの動的Webサービスを作成しました。次に、WCFデータサービス仕様に従ってIQueryable Interfaceを返す操作を持つOData Webサービスを作成する必要があります。 IL Emitステートメントに基づいて動的メソッドを作成しています。しかし、IQueryableであるMethodBuilderに戻り型を割り当てることができません。CIL MethodBuilderとIQueryableを使用した動的メソッドの作成<DynamicType>戻り値の型

具体的には、戻り値の型IQueryableが実行時に生成されるため、MethodBuilder.SetReturnTypeメソッドを使用して戻りパラメータを設定できません。

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; } 
     } 

IL生成コードのメソッド生成の青いプリントを私に提供することはできますか?

+0

[のIQueryable 戻り値の型とMethodBuilderを使用した動的方法](の可能性のある重複http://stackoverflow.com/questions/42654679/dynamic-method-using-methodbuilder-with- – thehennyy

+0

私は新しい質問をすることはできません..元の投稿を削除しました – badari

+0

私は投票しませんでした。とにかくここでも同じ質問をしています。まだ不明な点は何ですか? SetReturnTypeメソッドの唯一のパラメータとして、型オブジェクトを渡すだけです。 – thehennyy

答えて

2

実行時まで不明な型パラメータを含む汎用型を作成するには、Type.MakeGenericTypeメソッドを使用する必要があります。あなたのコードは次のようになります。

//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; 
関連する問題