2017-03-08 42 views
-1

我已经为SOAP和REST编写了动态Web服务。现在需要创建具有按照WCF数据服务规范返回IQueryable接口的操作的OData Web服务。 我正在创建一个基于IL Emit语句的动态方法。但是我不能将返回类型分配给IQueryable的MethodBuilder。使用带IQueryable的CIL MethodBuilder创建动态方法<DynamicType>返回类型

具体而言,我无法使用MethodBuilder.SetReturnType方法设置返回参数,因为在运行时会生成返回类型IQueryable。

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

[使用MethodBuilder与IQueryable的返回类型的动态方法(可能的重复http://stackoverflow.com/questions/42654679/dynamic-method-using-methodbuilder-with- iqueryabledynamictype-return-type) – thehennyy

+0

请撤消downvote ..我不能提出新的问题..我删除了我原来的帖子 – 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;