zoukankan      html  css  js  c++  java
  • C#_表达式目录树的应用

     使用表达式目录树实现两个不同类型的属性赋值:

    People类:

    1   public class People
    2     {
    3         public int Age { get; set; }
    4         public string Name { get; set; }
    5 
    6         public int Id;
    7 
    8     }
    View Code

    PeopleCopy类:

     1 namespace ConsoleApp2
     2 {
     3     public class PeopleCopy
     4     {
     5         public int Age { get; set; }
     6         public string Name { get; set; }
     7 
     8         public int Id;
     9 
    10         public override string ToString()
    11         {
    12             return "Age="+Age+";Name="+Name+";Id="+Id;
    13         }
    14     }
    15 }
    View Code
    实现类型属性赋值:ExpressionTree类
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Linq.Expressions;
     5 using System.Reflection;
     6 
     7 namespace ConsoleApp1
     8 {
     9     public class Class1
    10     {
    11     
    12         private static Dictionary<string, object> _Dic = new Dictionary<string, object>();
    13         private static TOut TransExp<TIn, TOut>(TIn tIn)
    14         {
    15             string key = $"funckey_{typeof(TIn).FullName}_{typeof(TOut).FullName}";
    16             if (!_Dic.Keys.Contains(key))
    17             {
    18                 ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
    19                 List<MemberBinding> memberBindingList = new List<MemberBinding>();
    20                 foreach (var item in typeof(TOut).GetProperties())
    21                 {
    22                     PropertyInfo propertyInfo = typeof(TIn).GetProperty(item.Name);
    23                     if (propertyInfo == null) { continue; }
    24                     MemberExpression property = Expression.Property(parameterExpression, propertyInfo);
    25                     memberBindingList.Add(Expression.Bind(item, property));
    26                 }
    27                 foreach (var item in typeof(TOut).GetFields())
    28                 {
    29                     FieldInfo fieldInfo = typeof(TIn).GetField(item.Name);
    30                     if (fieldInfo == null) { continue; }
    31                     MemberExpression property = Expression.Field(parameterExpression, fieldInfo);
    32                     memberBindingList.Add(Expression.Bind(item, property));
    33                 }
    34                 Expression<Func<TIn, TOut>> expression = Expression.Lambda<Func<TIn, TOut>>(Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList), new ParameterExpression[]
    35                 {
    36 parameterExpression
    37                 });
    38                 Func<TIn, TOut> func = expression.Compile();
    39                 _Dic.Add(key, func);
    40             }
    41             return ((Func<TIn, TOut>)_Dic[key])(tIn);
    42         }
    43 
    44     }
    45 }
    View Code

     测试:Program类:

     1 using System;
     2 using System.Collections.Generic;
     3 
     4 namespace ConsoleApp2
     5 {
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10 
    11             List<PeopleCopy> peoleCopyList = new List<PeopleCopy>();
    12             for (int i = 0; i < 5; i++)
    13             {
    14                 People people = new People() { Id = 5 + 1, Age = 25, Name = "aaa" + i };
    15                 peoleCopyList.Add(ExpressionTree.TransExp<People, PeopleCopy>(people));
    16             }
    17             foreach (var item in peoleCopyList)
    18             {
    19                 Console.WriteLine(item);
    20             }
    21             Console.Read();
    22         }
    23     }
    24 }
    View Code

    结果如下:

    ExpressionTreeVisualize for vs2017

    Expression Tree Visualizer 是一个集成在Visual Studio中的工具,用于在运行时以树状结构显示出指定的Expression。
    明天你会感激你今天所做的努力。
  • 相关阅读:
    HDU 5059 Help him
    HDU 5058 So easy
    HDU 5056 Boring count
    HDU 5055 Bob and math problem
    HDU 5054 Alice and Bob
    HDU 5019 Revenge of GCD
    HDU 5018 Revenge of Fibonacci
    HDU 1556 Color the ball
    CodeForces 702D Road to Post Office
    CodeForces 702C Cellular Network
  • 原文地址:https://www.cnblogs.com/Torey/p/8048131.html
Copyright © 2011-2022 走看看