Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Diagnostics;
- using System.Linq.Expressions;
- namespace ConsoleApp11
- {
- class Program
- {
- static void Main(string[] args)
- {
- var c1 = BuildLambda<Class1, int>("Id").Compile();
- for (int i = 0; i < 100_000_000; i += 100_000)
- {
- Stopwatch sw = Stopwatch.StartNew();
- Test1(i);
- var time1 = sw.ElapsedMilliseconds;
- sw = Stopwatch.StartNew();
- Test2(i, c1);
- var time2 = sw.ElapsedMilliseconds;
- var start = $"{i:N0}".PadRight(10);
- Console.WriteLine($"{start} iterations - new: {time1}ms. | func {time2}ms.");
- i *= 5;
- }
- }
- static void Test1(int count)
- {
- for (int i = 0; i < count; i++)
- {
- var t = new Class1() { Id = i };
- }
- }
- static void Test2(int count, Func<int, Class1> c1)
- {
- for (int i = 0; i < count; i++)
- {
- var t = c1.Invoke(i);
- }
- }
- public static Expression<Func<A1, T>> BuildLambda<T, A1>(string param1Name)
- {
- var createdType = typeof(T);
- var param = Expression.Parameter(typeof(A1), param1Name);
- var ctor = Expression.New(createdType);
- var prop = createdType.GetProperty(param1Name);
- var displayValueAssignment = Expression.Bind(prop, param);
- var memberInit = Expression.MemberInit(ctor, displayValueAssignment);
- return
- Expression.Lambda<Func<A1, T>>(memberInit, param);
- }
- }
- public class Class1
- {
- public int Id { get; set; }
- public override string ToString()
- {
- return $"My Id is {Id}";
- }
- }
- public class ExpressionParam
- {
- public ExpressionParam(string name, Type type)
- {
- this.Name = name;
- this.Type = type;
- }
- public string Name { get; set; }
- public Type Type { get; set; }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement