既然说到泛型和反射就先简单介绍一下吧:
泛型:
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
优点:
1.使用泛型类、方法,我们可以极大提高代码的重用性,不需要对类型不同代码相同(仅类型参数不同)的代码写多次。
2.创建泛型类,可在编译时创建类型安全的集合
3.避免装箱和拆箱操作降低性能,在大型集合中装箱和拆箱的影响非常大.
可以创建:泛型接口、泛型类、泛型方法、泛型事件和泛型委托。本程序只用到了泛型方法所以其他不多作介绍。
泛型方法:(可以作为传入参数,也可以作为返回值)
public T void Create<T>(T t)
{
return default(T)
}
反射:
概念:
通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象。
反射机制允许程序在执行过程中动态地添加各种功能。
反射常用类
System.Reflection.Assembly
System.Reflection.MemberInfo
System.Reflection.EventInfo
System.Reflection.MethodInfo
System.Reflection.PropertyInfo
System.Type
以下是上面几个类的使用方法:
(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或 GetConstructor方法来调用特定的构造函数。
(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。
(5)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
(6)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
常用的反射代码:
//1通过类型创建一个对象
Activator.CreateInstance(Type)
//2通过Assembly动态加载一个程序集
Assembly assembly = Assembly.Load("程序集名称");
//3通过Type获取类型
Type type = typeof(int);
//4通过类型可以创建一个对象
T obj=(T)Activator.CreateInstance(type);
//5通过类型获取属性集合
PropertyInfo[] plist = type.GetProperties();
//6通过类型获取方法的集合
MethodInfo[] methods = type.GetMethods();
了解过后,话不多说,直接上代码:
添加:
public int Add<T>(T model)
{
T t = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] plist = typeof(T).GetProperties();
//plist中存放的是表中的字段名
SqlParameter[] parameters = new SqlParameter[plist.Length];
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into "+typeof(T).Name+" (");
//typeof(T).Name 是获取到表名添加到sql语句中
for (int i = 1; i < plist.Length; i++)
{
strSql.Append("" + plist[i].Name + ",");
}
strSql.Remove(strSql.Length - 1, 1);
strSql.Append(") values (");
for (int i = 1; i < plist.Length; i++)
{
strSql.Append("@" + plist[i].Name + ",");
}
strSql.Remove(strSql.Length - 1, 1);
strSql.Append(");select @@IDENTITY");
//以上两个循坏是编写sql语句
for (int i = 0; i < plist.Length; i++)
{
parameters[i] = new SqlParameter("@" + plist[i].Name + "", plist[i].GetValue(t));
}
//将参数传进去
object obj = DbHelperSQL.GetSingle(strSql.ToString(), connstr);
//GetSingle是连接数据库获取表的方法,这里就不详细介绍了
if (obj == null)
{
return 0;
}
else
{
return Convert.ToInt32(obj);
}
}
更新
//更新和添加方法用到的东西都差不多,上面用到的就不写注释了
public bool Update<T>(T model)
{
T t = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] plist = typeof(T).GetProperties();
SqlParameter[] parameters = new SqlParameter[plist.Length];
StringBuilder strSql = new StringBuilder();
strSql.Append("update "+typeof(T).Name+" set ");
for (int i = 1; i < plist.Length; i++)
//这里i从1开始是因为一般plist[0]是主键id,主键是不能修改的
{
strSql.Append(""+plist[i].Name+"=@"+plist[i].Name+",");
}
strSql.Remove(strSql.Length - 1, 1);
strSql.Append(" where " + plist[0].Name + "=@" + plist[0].Name + "");
for (int i = 0; i < plist.Length; i++)
{
parameters[i] = new SqlParameter("@" + plist[i].Name + "", plist[i].GetValue(t));
}
int rows = DbHelperSQL.ExecuteSql(strSql.ToString(), connstr);
if (rows > 0)
{
return true;
}
else
{
return false;
}
}
本文介绍了ASP.Net C#中如何利用泛型和反射进行数据的添加和更新操作。泛型提高了代码复用性和类型安全性,而反射则允许在运行时动态获取和操作类型信息。文中详细讲解了泛型的优点,以及反射的概念和常用类,如Assembly、Module、ConstructorInfo、MethodInfo等,并提供了具体的代码示例来演示如何进行添加和更新操作。
384

被折叠的 条评论
为什么被折叠?



