using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
public class Test
{
public static void Main()
{
// Getting types/methods
var itemType = typeof(double);
var repeatMethod = typeof(Enumerable).GetMethod(nameof(Enumerable.Repeat)).MakeGenericMethod(itemType);
var queueType = typeof(Queue<>).MakeGenericType(itemType);
var queueCtor = queueType.GetConstructor(new[] { typeof(IEnumerable<>).MakeGenericType(itemType) });
// Build the Func<>
var repeatCall = Expression.Call(repeatMethod, Expression.Constant(Convert.ChangeType(100, itemType)), Expression.Constant(1, typeof(int)));
var ctorCall = Expression.New(queueCtor, repeatCall);
var lambda = Expression.Lambda<Func<Queue<double>>>(ctorCall);
// How does the result look like?
Console.WriteLine(lambda.ToString());
var func = lambda.Compile();
// Call it :-)
var queue = func();
Console.WriteLine(queue.Count);
Console.WriteLine(queue.Dequeue());
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5MaW5xLkV4cHJlc3Npb25zOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJICAgIC8vIEdldHRpbmcgdHlwZXMvbWV0aG9kcwogICAgICAgIHZhciBpdGVtVHlwZSA9IHR5cGVvZihkb3VibGUpOwogICAgICAgIHZhciByZXBlYXRNZXRob2QgPSB0eXBlb2YoRW51bWVyYWJsZSkuR2V0TWV0aG9kKG5hbWVvZihFbnVtZXJhYmxlLlJlcGVhdCkpLk1ha2VHZW5lcmljTWV0aG9kKGl0ZW1UeXBlKTsKICAgICAgICAKICAgICAgICB2YXIgcXVldWVUeXBlID0gdHlwZW9mKFF1ZXVlPD4pLk1ha2VHZW5lcmljVHlwZShpdGVtVHlwZSk7CiAgICAgICAgdmFyIHF1ZXVlQ3RvciA9IHF1ZXVlVHlwZS5HZXRDb25zdHJ1Y3RvcihuZXdbXSB7IHR5cGVvZihJRW51bWVyYWJsZTw+KS5NYWtlR2VuZXJpY1R5cGUoaXRlbVR5cGUpIH0pOwogICAgICAgIAogICAgICAgIC8vIEJ1aWxkIHRoZSBGdW5jPD4KICAgICAgICB2YXIgcmVwZWF0Q2FsbCA9IEV4cHJlc3Npb24uQ2FsbChyZXBlYXRNZXRob2QsIEV4cHJlc3Npb24uQ29uc3RhbnQoQ29udmVydC5DaGFuZ2VUeXBlKDEwMCwgaXRlbVR5cGUpKSwgRXhwcmVzc2lvbi5Db25zdGFudCgxLCB0eXBlb2YoaW50KSkpOwogICAgICAgIHZhciBjdG9yQ2FsbCA9IEV4cHJlc3Npb24uTmV3KHF1ZXVlQ3RvciwgcmVwZWF0Q2FsbCk7CiAgICAgICAgCiAgICAgICAgdmFyIGxhbWJkYSA9IEV4cHJlc3Npb24uTGFtYmRhPEZ1bmM8UXVldWU8ZG91YmxlPj4+KGN0b3JDYWxsKTsKICAgICAgICAKICAgICAgICAvLyBIb3cgZG9lcyB0aGUgcmVzdWx0IGxvb2sgbGlrZT8KICAgICAgICBDb25zb2xlLldyaXRlTGluZShsYW1iZGEuVG9TdHJpbmcoKSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZ1bmMgPSBsYW1iZGEuQ29tcGlsZSgpOwogICAgICAgIAogICAgICAgIC8vIENhbGwgaXQgOi0pCiAgICAgICAgdmFyIHF1ZXVlID0gZnVuYygpOwogICAgICAgIAogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHF1ZXVlLkNvdW50KTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShxdWV1ZS5EZXF1ZXVlKCkpOwoJfQp9