using System;
using System.Collections.Generic;
using System.Linq.Expressions;
public class Test
{
public static void Main()
{
// Getting types/methods
var queueItemType = typeof(double);
var queueType = typeof(Queue<>).MakeGenericType(queueItemType);
var queueEnqueueMethod = queueType.GetMethod(nameof(Queue<object>.Enqueue), new[] { queueItemType });
// Build the Func<>
var result = Expression.Parameter(queueType, "result");
var queueInstance = Expression.New(queueType);
var resultAssign = Expression.Assign(result, queueInstance);
var queueItem = Expression.Constant(Convert.ChangeType(100, queueItemType), queueItemType);
var addCall = Expression.Call(result, queueEnqueueMethod, queueItem);
var body = new List<Expression>
{
resultAssign,
addCall,
result // The last line in body will be the result value of the Func<>.
};
var lambda = Expression.Lambda<Func<Queue<double>>>(Expression.Block(new[] { result }, body));
var func = lambda.Compile();
// Call it :-)
var queue = func();
Console.WriteLine(queue.Count);
Console.WriteLine(queue.Dequeue());
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnM7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJICAgICAgICAvLyBHZXR0aW5nIHR5cGVzL21ldGhvZHMKICAgICAgICB2YXIgcXVldWVJdGVtVHlwZSA9IHR5cGVvZihkb3VibGUpOwogICAgICAgIHZhciBxdWV1ZVR5cGUgPSB0eXBlb2YoUXVldWU8PikuTWFrZUdlbmVyaWNUeXBlKHF1ZXVlSXRlbVR5cGUpOwogICAgICAgIHZhciBxdWV1ZUVucXVldWVNZXRob2QgPSBxdWV1ZVR5cGUuR2V0TWV0aG9kKG5hbWVvZihRdWV1ZTxvYmplY3Q+LkVucXVldWUpLCBuZXdbXSB7IHF1ZXVlSXRlbVR5cGUgfSk7CgogICAgICAgIC8vIEJ1aWxkIHRoZSBGdW5jPD4KICAgICAgICB2YXIgcmVzdWx0ID0gRXhwcmVzc2lvbi5QYXJhbWV0ZXIocXVldWVUeXBlLCAicmVzdWx0Iik7CgogICAgICAgIHZhciBxdWV1ZUluc3RhbmNlID0gRXhwcmVzc2lvbi5OZXcocXVldWVUeXBlKTsKICAgICAgICB2YXIgcmVzdWx0QXNzaWduID0gRXhwcmVzc2lvbi5Bc3NpZ24ocmVzdWx0LCBxdWV1ZUluc3RhbmNlKTsKCiAgICAgICAgdmFyIHF1ZXVlSXRlbSA9IEV4cHJlc3Npb24uQ29uc3RhbnQoQ29udmVydC5DaGFuZ2VUeXBlKDEwMCwgcXVldWVJdGVtVHlwZSksIHF1ZXVlSXRlbVR5cGUpOwogICAgICAgIHZhciBhZGRDYWxsID0gRXhwcmVzc2lvbi5DYWxsKHJlc3VsdCwgcXVldWVFbnF1ZXVlTWV0aG9kLCBxdWV1ZUl0ZW0pOwoKICAgICAgICB2YXIgYm9keSA9IG5ldyBMaXN0PEV4cHJlc3Npb24+CiAgICAgICAgewogICAgICAgICAgICByZXN1bHRBc3NpZ24sCiAgICAgICAgICAgIGFkZENhbGwsCiAgICAgICAgICAgIHJlc3VsdCAgLy8gVGhlIGxhc3QgbGluZSBpbiBib2R5IHdpbGwgYmUgdGhlIHJlc3VsdCB2YWx1ZSBvZiB0aGUgRnVuYzw+LgogICAgICAgIH07CgogICAgICAgIHZhciBsYW1iZGEgPSBFeHByZXNzaW9uLkxhbWJkYTxGdW5jPFF1ZXVlPGRvdWJsZT4+PihFeHByZXNzaW9uLkJsb2NrKG5ld1tdIHsgcmVzdWx0IH0sIGJvZHkpKTsKICAgICAgICB2YXIgZnVuYyA9IGxhbWJkYS5Db21waWxlKCk7CgogICAgICAgIC8vIENhbGwgaXQgOi0pCiAgICAgICAgdmFyIHF1ZXVlID0gZnVuYygpOwoKICAgICAgICBDb25zb2xlLldyaXRlTGluZShxdWV1ZS5Db3VudCk7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUocXVldWUuRGVxdWV1ZSgpKTsKCX0KfQ==