c#2.0的新功能(二):泛型的其他的一些信息

    技术2022-05-11  60

    一、泛型的转换

    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使用泛型。


    最新回复(0)