原理:
泛型是语法糖,在编译时,会为调用者生成各种类型的方法副本.
也就是说, 不用开发者自己写具体方法,是编译器代劳了这一工作,只是节省了开发者的时间
demo代码:
public class GenericClass
{
/// <summary>
/// 泛型方法,调用时可不传T类型,可以隐式推断类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parameter"></param>
public static void Show<T>(T parameter)
{
Console.WriteLine("value={0},type={1}", parameter, parameter.GetType());
}
}
public class Common
{
public static void ShowInt(int parameter)
{
Console.WriteLine("value={0},type={1}", parameter, parameter.GetType());
}
public static void ShowString(string parameter)
{
Console.WriteLine("value={0},type={1}", parameter, parameter.GetType());
}
public static void ShowDouble(double parameter)
{
Console.WriteLine("value={0},type={1}", parameter, parameter.GetType());
}
/// <summary>
/// 可以达到目的
/// 但有拆箱装箱过程,有性能损失
/// </summary>
/// <param name="parameter"></param>
public static void ShowObject(object parameter)
{
Console.WriteLine("value={0},type={1}", parameter, parameter.GetType());
}
}
/// <summary>
/// 泛型约束
/// 同一个类型的多个约束,用英文逗号分开
/// 引用类型:where T : class
/// new约束,可以new一个对象、有一个无参数构造函数: where T : new()
/// 值类型:where T : struct
/// 类型约束,必须是约束类型或其子类:where T : demoModel
/// </summary>
public class GenericConstraint
{
/// <summary>
/// 限制只能传引用类型、有一个无参数构造函数的类型参数
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parameter"></param>
public static T Show<T>(T parameter)
where T : class,new()
{
T ret = default(T);
Console.WriteLine("Show value={0}", ret);
return ret;
}
/// <summary>
/// 限制只能传值类型参数
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parameter"></param>
public static T ShowStruct<T>(T parameter)
where T : struct
{
T ret = default(T);
Console.WriteLine("ShowStruct value={0}", ret);
return ret;
}
}
public class demoModel
{
public int Id { get; set; }
public string Name { get; set; }
}调用:
static void Main(string[] args)
{
int iParameter = 123;
string sParemeter = "test";
double dParameter = 345.67;
//自己写具体类型方法,没性能损失,但要自己写这么多方法,重复的工作,浪费时间
Common.ShowInt(iParameter);
Common.ShowString(sParemeter);
Common.ShowDouble(dParameter);
Common.ShowObject(iParameter);//object是所有类型的父类,可以转换,有性能损失,实际开发中大多需要转换为具体类型,开发起来比较麻烦
Common.ShowObject(iParameter);
Common.ShowObject(iParameter);
/*
泛型调用
*/
GenericClass.Show(iParameter);
GenericClass.Show(sParemeter);
GenericClass.Show(dParameter);
//泛型约束,如果参数不满足要求,编译不会通过
GenericConstraint.Show(new demoModel());
GenericConstraint.ShowStruct(666);
Console.ReadKey();
}