一、概述
我们为什么要用泛型?简而言之是为了提高代码的泛用性,所以才存在的。假设我需要处理十个类,并且对十个类处理的方法都一样,如果没有泛型的话那么我们需要定义十个方法来处理不同的类,你或许可以将方法中公用的部分提取出来,但是声明十个方法是不可避免的,但是有了泛型就不一样了,我们可以将十个方法变为一个方法,大大的简化了开发的步骤。
二、包含泛型方法的创建与使用
方法的创建
static bool compare<T>(T first, T second) where T:class
{
if (first == null || second==null)
{ return false; }
else { return first == second; }
}
在普通的方法后加上<泛型名称>声明一个带泛型参数的方法,泛型类可作为输入和输出的类型使用。泛型可以设置泛型约束条件来作为泛型的规范,语法为 方法后加 where 泛型名称:约束条件,上面的代码中泛型必须为一个class,基础的泛型条件除了class还有struct,Stream,IDisposable等,约束new()会检查类型实参是否有一个可用于创建类型示例的无参数构造函数,此外约束还可以是其他自定义的类,这样做泛型参数就必须是类本身或者该类的子类。 泛型可一次性声明多个,并且每个泛型类型也可以绑定多个不互相冲突的约束条件。
操作如下:
class father
{
public int? len1 = 5;
}
class child:father
{
public int len2 = 6;
}
class child2 : father
{
public int len3 = 6;
}
class 泛型
{
static bool compare<T>(T first, T second) where T : father
{
return first.len1 + 1 == second.len1;
}
static void Main(string[] args)
{
child ch1 = new child();
ch1.len1 = 4;
child ch2 = new child();
Console.WriteLine( compare(ch1, ch2));
}
}
输出:
此外我们还能够使用System.Activator.CreateInstance<T>()对泛型来进行实例化操作与使用:
private static List<T> getTList<T>(int num)
{
List<T> TList=new List<T>();
for (int i = 0; i < num;i++ )
{ TList.Add( System.Activator.CreateInstance<T>()); }
return TList;
}
static void Main(string[] args)
{
var ListData = getTList<father>(5);
Console.WriteLine("条数:"+ListData.Count());
}
输出:
甚至可以利用反射来对实例化之后的泛型进行赋值操作,以下是datatable对与其相应泛型的list的转化。
public static void getModeList<T>(DataTable dtData, out List<T> ModeList) where T:BASE
{
ModeList = new List<T>();
//通过反射将datatable加载到相应的list中
foreach(DataRow drData in dtData.Rows)
{
T Mode = System.Activator.CreateInstance<T>();
foreach (DataColumn dcData in dtData.Columns)
{
Type tp = Mode.GetType().GetField(dcData.ColumnName.ToLower()).FieldType;
if (drData[dcData.ColumnName] == DBNull.Value)
{ continue; }
Mode.GetType().GetField(dcData.ColumnName.ToLower()).SetValue(Mode, Convert.ChangeType(drData[dcData.ColumnName], (tp == typeof(double?))?typeof(double):tp));
}
ModeList.Add(Mode);
}
}