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?
Mögliche Duplikat [Dynamische Methode Method mit IQueryable Rückgabetyp] (http://stackoverflow.com/questions/42654679/dynamic-method-using-methodbuilder-with- iqueryabledynamictype-return-type) –
thehennyy
Bitte machen Sie den Downvote rückgängig .. Ich kann keine neuen Fragen stellen .. Ich habe meinen ursprünglichen Beitrag gelöscht – badari
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