一、泛型的转换
1、可以隐式转换到object以及派生约束指定的类。
class MyClass<T> where T BaseClass , ISomeInterface
T可以转换到object , BaseClass , ISomeInterface。
2、显式转换,可以转换到接口,不能显示转换到类,是类型不安全的。
3、解决方法:
a. object temp=t;SomeClass obj =(SomeClass)temp;
b.用 is 和 as
if ( t is LinkedList<int ,string>){...}
LinkedList<int,string> list = t as LinkedList<int ,string>; if ( t != null){...}
二、继承
1、定义
public class BaseClass<T>
public class SubClass:BaseClass<int>
public class SubClass<T>:BaseClass<T>
2、子类继承父类时,必须把约束放到子类的后面
public class BaseClass<T> where T :ISomeInterface
public class SubClass<T>:BaseClass<T> where T :ISomeInterface
三、泛型不支持+ , +=,因为没有办法加运算符约束。解决方法:使用泛型抽象类和泛型接口。
1、泛型抽象类
public abstract class BaseClass<T>
{
public abstract T add( T arg1 , T arg2 );
}
public class SubClass :BaseClass<int>
{
public override int add( int arg1 , int arg2 );
{
return arg1 + arg2 ;
}
}
2、泛型接口同上,就不写了。
四、泛型方法,实例方法和静态方法都是一样的,可以单独给泛型方法参数。特性类不能用泛型。
1、定义
public class MyClass<T>
{
public void MyMethod<X>(X x){...}
}
public class MyClass2
{
public void MyMethod<T>(T t){...}
public T MyMethod2<T>(){...}
}
2、使用
MyClass2 myClass = new MyClass2 ();
myClass .MyMethod<int>(3);
myClass .MyMethod(3);//可以省略
myClass .MyMethod2();//不能编译
3、可以使用约束,但是子类的复写方法不能再加约束。
五、泛型委托和事件
1、定义
public class MyClass<T>
{
public delegate void GenDelegate(T t );
public void SomeMethod(T t);
}
2、实现
MyClass<int> obj = new MyClass<int>;
MyClass<int>.GenDelegate() del; //委托居然是用类引用的,很意外啊。
del = new MyClass<int>.GenDelegate(obj.SomeMethod);
del = obj.SomeMethod; //也可以
del(3);
3、也可以用约束。
六、反射,也可以使用typeof , GetType()。
1、还可以用typeof(MyClass<>)表示空的,多个的话用LinkedList<,>。
Type 类中有些比较重要的方法:
Type[] GetGenericArguments();//泛型的参数信息
Type[] GetGenericParameterConstraints();//泛型的约束
Type GetGenericDefinition();//泛型的定义信息
bool IsGenericType();//是不是泛型类型
2、MethodInfo和MethodBase
methodInfo.Invoke( list , args);
七、泛型集合,定义了多个泛型的类和接口。
八、不能在WebService使用泛型,不能在Com使用泛型。