正在阅读:C# 最强大的功能--泛型简介C# 最强大的功能--泛型简介

2005-06-23 10:16 出处: 作者:Juval Lowy 责任编辑:moningfeng

与 C# 1.1 中一样,您可以使用 MethodInfo(以及很多其他选项)进行晚期绑定调用。但是,您为晚期绑定传递的参数的类型,必须与取代一般类型参数而使用的绑定类型(如果有)相匹配:

LinkedList list = new LinkedList();
Type type = list.GetType();
MethodInfo methodInfo = type.GetMethod("AddHead");
object[] args = {1,"AAA"};
methodInfo.Invoke(list,args);



属性和泛型

在定义属性时,可以使用枚举 AttributeTargets 的新 GenericParameter 值,通知编译器属性应当以一般类型参数为目标:

[AttributeUsage(AttributeTargets.GenericParameter)]
public class SomeAttribute : Attribute
{...}



请注意,C# 2.0 不允许定义一般属性。

//Does not compile:
public class SomeAttribute : Attribute
{...}



然而,属性类可以通过使用一般类型或者定义 Helper 一般方法(像其他任何类型一样)在内部利用泛型:

public class SomeAttribute : Attribute
{
void SomeMethod(T t)
{...}
LinkedList m_List = new LinkedList();
}




泛型和 .NET Framework
为了对本文做一下小结,下面介绍 .NET 中除 C# 本身以外的其他一些领域如何利用泛型或者与泛型交互。

System.Array 和泛型

System.Array 类型通过很多一般静态方法进行了扩展。这些一般静态方法专门用于自动执行和简化处理数组的常见任务,例如,遍历数组并且对每个元素执行操作、扫描数组,以查找匹配某个条件(谓词)的值、对数组进行变换和排序等等。代码块 11 是这些静态方法的部分清单。

代码块 11. System.Array 的一般方法

public abstract class Array
{
//Partial listing of the static methods:
public static IList AsReadOnly(T[] array);
public static int BinarySearch(T[] array, T value);
public static int BinarySearch(T[] array, T value,
IComparer comparer);
public static U[] ConvertAll(T[] array,
Converter converter);
public static bool Exists(T[] array,Predicate match);
public static T Find(T[] array,Predicate match);
public static T[] FindAll(T[] array, Predicate match);
public static int FindIndex(T[] array, Predicate match);
public static void ForEach(T[] array, Action action);
public static int IndexOf(T[] array, T value);
public static void Sort(K[] keys, V[] items,
IComparer comparer);
public static void Sort(T[] array,Comparison comparison)
}



System.Array 的静态一般方法都使用 System 命名空间中定义的下列四个一般委托:

public delegate void Action(T t);
public delegate int Comparison(T x, T y);
public delegate U Converter(T from);
public delegate bool Predicate(T t);



代码块 12 演示如何使用这些一般方法和委托。它用从 1 到 20 的所有整数初始化一个数组。然后,代码通过一个匿名方法和 Action 委托,使用 Array.ForEach() 方法来跟踪这些数字。使用第二个匿名方法和 Predicate 委托,代码通过调用 Array.FindAll() 方法(它返回另一个相同的一般类型的数组),来查找该数组中的所有质数。最后,使用相同的 Action 委托和匿名方法来跟踪这些质数。请注意代码块 12 中类型参数推理的用法。您在使用静态方法时无须指定类型参数。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品