泛型反射常见应用,通过类型创建实例,通过反射实现增删改查

davidhuatit davidhuatit     2023-04-30     410

关键词:

public class Test
    


        public void MyObj<T>() where T : class
        
            //T t = new T();
            T t =System.Activator.CreateInstance<T>();
            //获取类型跟字段然后拿到对应名字方法跟字段就可以了
        
    

  

微信官方创建实体的方法,通过泛型类型创建实例
System.Activator.CreateInstance<T>();





新增:
public static void Add<T>(T model)
        
            Type t = typeof(T);
            string TableName = GetTableName(t);
            PropertyInfo[] pps = t.GetProperties();
            StringBuilder sb = new StringBuilder("insert into"+ TableName + "(");
            StringBuilder sbColumns = new StringBuilder();
            StringBuilder sbValues = new StringBuilder();
            foreach (PropertyInfo item in pps)
            
                if (!IsNotMapper(item)&& !IsKey(item))
                
                    sbColumns.Append(item.Name+",");
                    if (IsNoStr(item.PropertyType))
                    
                        
                        if (item.GetValue(model)==null|| string.IsNullOrEmpty(item.GetValue(model).ToString()))
                        
                            sbValues.Append("null,");
                        
                        else
                        
                            
                            if (IsBoolean(item.PropertyType))
                            
                                bool bvalue = (bool)item.GetValue(model);
                                sbValues.Append((bvalue?1:0) + ",");
                            
                            else
                            
                                sbValues.Append(item.GetValue(model) + ",");
                            
                            
                        
                    
                    else
                    
                        sbValues.Append("‘"+item.GetValue(model) + "‘,");
                    
                    
                
            
            string sql = string.Format("insert into " + TableName + "(0) values(1)",sbColumns.ToString().TrimEnd(‘,‘), sbValues.ToString().TrimEnd(‘,‘));
            connection.Execute(sql);
        

  




修改:
public static void Update<T>(T model)
        
            Type t = typeof(T);
            string TableName = GetTableName(t);
            PropertyInfo[] pps = t.GetProperties();
            StringBuilder sb = new StringBuilder();
            string where = "";
            foreach (PropertyInfo item in pps)
            
                if (!IsNotMapper(item))
                
                    string column = item.Name;
                    string value = item.GetValue(model).ToString();
                    if (!IsKey(item))
                    
                        if (IsNoStr(item.PropertyType))
                        
                            if (IsBoolean(item.PropertyType))
                            
                                bool bvalue = (bool)item.GetValue(model);
                                value = bvalue ? "1" : "0";
                            
                            sb.Append(column + "=" + value + ",");
                        
                        else
                        
                            sb.Append(column + "=‘" + value + "‘,");
                        
                    
                    else
                    
                        where = column + "=" + value;
                    
                
            

            string sql = string.Format("update 0 set 1 where 2 ",TableName,sb.ToString().TrimEnd(‘,‘),where);
        

  

 

 

 

删除:

public static void Delete<Key, T>(Key id)
        
            Type tp = typeof(T);
            PropertyInfo[] pps = tp.GetProperties();
            string KeyName = "";
            Key Value = id;
            foreach (PropertyInfo item in pps)
            
                if (!IsNotMapper(item)&& IsKey(item))
                
                    KeyName = item.Name;
                
            
            if (IsNoStr(typeof(Key)))
            
                string sql = "delete " + GetTableName(tp) + " where " + KeyName + "=" + Value;
            
            else
            
                string sql = "delete " + GetTableName(tp) + " where " + KeyName + "=‘" + Value + "‘";
            
        

  

 

判断字段或类是否包含特性:

/// <summary>
        /// 是否包含该特性
        /// </summary>
        /// <param name="item"></param>
        /// <param name="tp"></param>
        /// <returns></returns>
        private static bool IsAttribute(PropertyInfo item, Type tp)
        
            var attr = item.GetCustomAttributes(tp, true);
            if (attr.Length <= 0)
                return false;
            return true;
        

  

 

 

抓取指定特性值(如表名,子段说明等特殊的属性):

/// <summary>
        /// 查询表名
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        private static string GetTableName(Type t)
        
            string Name = t.Name;
            object[] os = t.GetCustomAttributes(typeof(TablNameAttribute), true);
            if (os.Length > 0)
            
                TablNameAttribute ta = os[0] as TablNameAttribute;
                Name = ta.TableName;
            
            return Name;
        

  

 


泛型反射是我们在做系统架构时需要经常用到的,如果能熟练应用到项目中可以对业务开发起到约束和管控的作用。












泛型反射和异常

JavaSE(十一)--泛型、反射和异常一、泛型泛型是javaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型... 查看详情

31反射(获取class实例剖析运行时类的完整结构读取properties文件反射创建类越过泛型检查)枚举(代码片段)

...orFieldMethod父类、接口、包4、反射的应用Properties配置文件泛型枚举1、枚举类的使用反射1、Java反射机制概述反射机制允许程序在执行期通过ReflectionAPI取得任何类的内部信息,并能直接操作任何对象的内部属性和方法;加载完类... 查看详情

javajav通过反射获取泛型信息(代码片段)

1.概述2.获得类的泛型子类继承泛型父类,并对泛型进行指定,通过反射获得指定类型,使用getGenericSuperclass()方法获得泛型父类判断是不是参数化类型是的话强转类型为ParameterizedType使用ParameterizedType的方法getActualTypeArguments()获得... 查看详情

javademo学习理解反射机制(基础学习)

...属性·反射机制的动态代理 反射机制的应用实例·在泛型为Integer的Arr 查看详情

[转]java反射机制详解

...类的属性·反射机制的动态代理4反射机制的应用实例·在泛型为Integer的ArrayList中存放一个String类型的对象。·通过反射取得并修改数组的信息·通过反射机制修改数组的大小·将反射机制应用于工厂模式1反射机制是什么反射机制... 查看详情

20170320_系统管理_用户管理1_反射得到model实例

...进:合并getModel,代码声明问题。 ps: 通过反射获得泛型的真实类型   通过反射得到model的实例。  包裹代码块异常:Shift+Alt+z================================================= 查看详情

通过反射构造泛型(混合类型列表示例)

.net2.0+Genericclassesmakecodesizemuchsmallerandcastingobjects(boxing)acinch.However,currentlytherearesomeunsupportedIDEoptionswhentryingtocastobjectstoandfromgenericobjectsthatusemixedobjecttypes(inheritedfromagenerictypespecifier).Fearnot,usingreflectionwecanbypasstheIDEandsupplytheuserswithstrong... 查看详情

java中反射(reflect)的常见应用场景

...的使用,方法和成员变量的反射,以及通过反射了解集合泛型的本质等知识。 1.Class类的使用/***使用java.lang.Class类动态加载一个类,编译时不对类是否存在以及对错进行检查,运行时检查*/publicclass 查看详情

通过泛型类中嵌套枚举的反射获取枚举值

】通过泛型类中嵌套枚举的反射获取枚举值【英文标题】:Getenumvaluesviareflectionfromnestedenumingenericclass【发布时间】:2017-04-2610:22:58【问题描述】:我需要从我通过反射获取的某些类型中打印出枚举值及其相应的下标值。这在大多... 查看详情

泛型dao

最近正在学习泛型DAO,通过网上查阅资料,汇总并自己整理了一下。提前需要学习的知识java反射、泛型用到的反射如下:Class<T>类是java.lang包下,Class类的实例表示正在运行的Java应用中的类和接口。Type接口是java.lang.reflect包... 查看详情

通过反射创建结构实例并设置值

】通过反射创建结构实例并设置值【英文标题】:Createinstanceofstructviareflectionandsetvalues【发布时间】:2022-01-0902:37:02【问题描述】:我想做什么我尝试将instance的struct传递给tags,包括tags到func,创建一个新的instance,并在field上设... 查看详情

java反射反射的应用----jdk动态代理

目录:1.类和接口的区别2.静态获取接口的实例----接口的实现类3.动态获取接口的实例----动态代理1.类和接口的区别Java中class和interface的区别:可以实例化class(非abstract类);不能实例化interface。所有interface类型的变量总是通过... 查看详情

利用泛型和反射实现idatareader转实体

publicstaticTReaderToModel<T>(IDataReaderrow){//1、使用与指定参数匹配最高的构造函数,来创建指定类型的实例TypemodelType=typeof(HShopingCarModel);Tmodel=Activator.CreateInstance<T>();for(inti=0;i<row.FieldCount;i++) 查看详情

泛型中的类型擦除(代码片段)

通过反射理解泛型的本质(类型擦除)Java中的泛型是通过类型擦除来实现的。所谓类型擦除,是指通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节... 查看详情

java筑基.泛型,反射,注解-利用注解加反射练习(代码片段)

文章目录泛型:泛型类泛型方法泛型接口子类明确泛型类的类型参数变量子类不明确泛型类的类型参数变量限定类型变量通配符泛型注解元注解注解的应用场景反射:注解+反射练习泛型:把类型明确的工作推迟到创建对象或调用... 查看详情

go基础之单元测试反射网络编程操作redis操作mysql(代码片段)

Go基础(四)之单元测试、反射、网络编程、操作Redis、操作MySQL一、单元测试二、反射2.1两个重要函数和类型2.2类型(Type)与种类(Kind)2.3通过反射获取值信息2.3.1从反射值对象获取值2.3.2通过反射访问结... 查看详情

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质importjava.lang.reflect.Method;importjava.util.ArrayList;/***通过反射了解集合泛型的本质*@authorshm**/publicclassMethodDemo02{ publicstaticvoidmain(String[]args){ ArrayListlist=newArrayList(); list.a 查看详情

c#wpf通过反射及ioc容器综合实例

概述  这节主要通过发射+Caliburn.Micro自带的ioc容器实现加载并显示其它项目中的界面.实现效果如下: 具体实现  -.①首先在引导程序页面通过发射加载类库,并将视图注入ioc容器,这里为了实现解耦合注入了ICom... 查看详情