-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发射代码的方法生成的蓝图吗?
[使用MethodBuilder与IQueryable的返回类型的动态方法(可能的重复http://stackoverflow.com/questions/42654679/dynamic-method-using-methodbuilder-with- iqueryabledynamictype-return-type) –
thehennyy
请撤消downvote ..我不能提出新的问题..我删除了我原来的帖子 – badari
我没有投票。无论如何,生病再次在这里问同样的问题。什么还不清楚?您只需将您的类型对象作为SetReturnType方法的唯一参数。 – thehennyy