C# 实体反射方法

发布时间 2023-04-18 17:13:11作者: 詩意飞行

1、引用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;

2、用法

  /// <summary>
        /// 查找实体的表序号及表名称
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"> 实体 </param>
        /// <param name="iTableId"> 返回表序号 </param>
        /// <param name="strTableName"> 返回表名称 </param>
        public static void FindT_ID_TableName<T>(T entity, out int iTableId, out string strTableName) {// where T : Entity, new() {
            iTableId = -1;
            strTableName = null;
            PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo item in Props) {
                if (item.Name.ToUpper().Trim() == "ID") {
                    int.TryParse(item.GetValue(entity, null).ToString(), out iTableId);
                }
                else if (item.Name == "DbTableName") {
                    strTableName = item.GetValue(entity, null).ToString();
                }
            }
        }
        /// <summary>
        /// 查找实体的主键名称
        /// </summary>
        /// <typeparam name="T"> 默认隶属于当前界面 </typeparam>
        /// <returns></returns>
        public static List<string> FindT_KeyName<T>() {
            List<PropertyInfo> lsProps = typeof(T).GetProperties().Where(p => p.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute), false).Length > 0).ToList();
            List<string> lsKeyName = lsProps.Select(s => s.Name).ToList();
            return lsKeyName;
        }
        /// <summary>
        /// 反射部分代码汇总
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        private void CodeAggregation<T>(T entity) {
            //通过反射获取Assembly对象
            //1.获取当前正在运行的程序集
            //1.1通过当前对象获取类型所属的程序集
            Assembly ass1 = this.GetType().Assembly;
            //1.2通过静态方法获取正在运行的程序集
            Assembly ass2 = Assembly.GetExecutingAssembly();
            //2.根据当前【应用程序域】获取程序集
            Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();
            //3.根据指定的程序集路径加载程序集
            string path = "xxxx";
            Assembly ass3 = Assembly.LoadFrom(@path);

            //通过反射获得Type对象
            //1.通过typeof 获取类对应的类型
            Type t1 = typeof(T);
            //2.通过对象的GetType方法 -- GetType方法 来自 Object 类!
            Type t2 = entity.GetType();
            //3.通过 程序集 获取类(两种写法)
            Assembly curAss = Assembly.GetExecutingAssembly();
            //3.1通过 实体类型对象 获取类
            curAss = entity.GetType().Assembly;

            //获取程序集里指定名称的类型对象 注意:必须写类的全名称!即类的完全限定名 = namespace+"."+classname
            Type t4 = curAss.GetType("dbo.T");
            //获取程序集里所有的类型对象
            Type[] types = curAss.GetTypes();
            //获取程序集里所有公共的类型对象
            Type[] publicTypes = curAss.GetExportedTypes();
        }
        /// <summary>
        /// 这个方法可以通过一个类访问同一个程序集内的另外一个类
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        private void Use1<T>(T entity) {
            Assembly ass1 = entity.GetType().Assembly;//获取类
            Type[] publicTypes_t21 = ass1.GetExportedTypes();//获取类的程序集

            Type t1 = publicTypes_t21.Where(p => p.Name.ToUpper() == "T2".ToUpper()).FirstOrDefault();
            if (t1 == null) return;
        }
        /// <summary>
        /// 实体类
        /// </summary>
        public class prop
        {
            [DisplayName("成员名称")]
            public string Name { get; set; }
            [DisplayName("成员值")]
            public object Value { get; set; }
            [DisplayName("成员注释")]
            public string DisplayName { get; set; }
        }
        /// <summary>
        /// 通过实体,获取实体的内容
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        private void GetDisplayName<T>(T entity) {
            PropertyInfo[] pros = entity.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo pro in pros) {
                DisplayNameAttribute da = pro.GetCustomAttributes(typeof(DisplayNameAttribute), true).Cast<DisplayNameAttribute>().SingleOrDefault();//注释
                if (da != null) {
                    prop p = new prop {
                        Name = pro.Name,
                        Value = pro.GetValue(entity, null).ToString(),
                        DisplayName = da.DisplayName
                    };
                }
            }
        }
        /// <summary>
        /// 获取实体值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        private string GetValue<T>(T entity) {
            return entity.GetType().GetProperty("xxx").GetValue(entity, null).ToString();
        }