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。
    明天你会感激你今天所做的努力。
  • 相关阅读:
    改变对象的字符串提示
    perl 和 python中的回调函数
    shiro权限验证标签
    user_tables 的信息依赖于统计信息
    centos jdk 1.7升级到1.8后显示还是1.7
    7.1 可接受任意数量参数的函数:
    IntelliJ IDEA中怎么查看文件中所有方法(类似eclipse里面的outline)
    Intellij IDEA 代码格式化与eclipse保持风格一致
    jquery-1.9.1.min.js:69 Uncaught TypeError: Illegal invocation
    python json模块
  • 原文地址:https://www.cnblogs.com/Torey/p/8048131.html
Copyright © 2011-2022 走看看