C# 实体反射方法
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(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下