泛型使用

简单总结一些泛型的使用:

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用;

需要注意的时候,一定要看准参数的类型化;

泛型使用方式

1、泛型继承:

  泛型能够实现基类数据的继承,如下举例:

 

class C<U,V>
class D:C<string,int>
class E<U,V>:C<U,V>
class F<U,V>:C<string,int>

 

2、泛型接口:

  泛型接口的类型参数要么已实例化,要么来源于实现类声明的类型参数;

public interface  IPerson<T>{}

3、泛型委托:

  动态指定参数类型,泛型委托支持在委托返回值和参数上应用参数类型,这些参数类型同样可以附带合法的约束;

delegate bool MyDelegate<T>(T value);

class MyClass

{

    static bool F(int i){...}

    static bool G(string s){...}

    static voidMain()

    {

        MyDelegate<string> p2 = G;

        MyDelegate<int> p1 = new MyDelegate<int>(F);

    }

}

4、泛型方法:

  C#泛型机制只支持“在方法声明上包含类型参数”——即泛型方法;

class Myclass
{
    static void Swap<T, U>(T myt, U mt)
    {
        Console.Write(myt.ToString() + mt.ToString());
    }
}
-------调用方式-----------
new dmy().Swap<int, string>(1, "1254");

5、泛型重写:

  在重写的过程中,抽象类中的抽象方法的约束是被默认继承的。

abstract class Base

{

    public abstract T F<T,U>(T t,U u) where U:T;

    public abstract T G<T>(T t) where T:IComparable;

}

 

class MyClass:Base

{

    public override X F<X,Y>(X x,Y y){...}

    public override T G<T>(T t) where T:IComparable{}

}

对于MyClass中两个重写的方法来说

F方法是合法的,约束被默认继承

G方法是非法的,指定任何约束都是多余的

泛型约束方式:

  泛型约束:“显式约束”由where子句表达,可以指定“基类约束”,“接口约束”,“构造器约束”,“值类型/引用类型约束”共四种约束。

class A
    {
    }
interface IA<T>
    {
    }
----------------------------
class C<S, T,B>
        where S : A
        where T : IA<T>
        where:B:new()
-----------------------------------

 

泛型协变和逆变:

in和out指定类型为逆变和协变;接口和委托;

 

泛型属性:

 

var handlers = typeof(ICommandHandler<>).Assembly.GetExportedTypes()
.Where(x => x.GetInterfaces().Any(a => a.IsGenericType && a.GetGenericTypeDefinition() == typeof(ICommandHandler<>)))
.Where(h => h.GetInterfaces().Any(ii => ii.GetGenericArguments().Any(aa => aa == typeof(T)))).ToList();
return handlers;

 

  

 

posted @ 2016-05-11 18:33  jiajinhao  阅读(221)  评论(0编辑  收藏  举报