C#中反射泛型
ASP.NET 2010-03-11 17:29:05 阅读338 评论1 字号:大中小 订阅
假设1我有个类叫SortClass,类中有个BubbleSort(int[] array)用于给数组进行排序。
假设2我有个类叫SortT<T>,类中有个BubbleSort(T[] array)用于给数组进行排序。
现在我需要在控制台应用程序里通过反射调用BubbleSort方法为数组int[] array进行排序。
int[] array = new int[] { 1,7,98,165,4,8,97 };
假设1中由于类和方法不是泛型,实现起来比较简单,我就不多说了。具体代码如下:
需要反射的类的代码:
public class SortClass
{ //一个简单的冒泡排序
public void BubbleSort(int[] array)
{ int temp;
for (int i = 0; i < array.Length - 1;i++ )
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[j] > array[i])
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
}
控制台中代码如下:
Assembly assembly = Assembly.LoadFrom(@"C:/Documents and Settings/lh/桌面/反射例子/反射/Exception_01_反射/bin/Debug/SortClasses.dll");
Console.WriteLine(assembly.FullName);
Object oo = assembly.CreateInstance( "SortClasses.SortClass" ); //得到对象 SortClasses为命名空间名
MethodInfo methodinfo = assembly.GetType( "SortClasses.SortClass" ).GetMethod( "BubbleSort" ); //得到方法
Object obj = methodinfo.Invoke(oo, new object[] { array }); //调用方法,给参数,得到结果
for (int i = 0; i < arrty.Length; i++)
{
Console.WriteLine(arrty[i]);
}
假设2 需要反射的是一个泛型,百度谷歌了很久才找到我想要的答案。有些代码我也还很不理解。唉,还得继续研究理解下。
需要反射的类的代码:
public class SortT<T>where T:IComparable
{
public void BubbleSort(T[] array)
{
T temp;
for (int i = 0; i < array.Length - 1; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[j].CompareTo(array[i])>0)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
}
控制台中代码如下:
Assembly assembly = Assembly.LoadFrom( @"F:/HomeWork/C#/反射例子/反射/SortClasses/bin/Debug/SortClasses.dll" );
Console.WriteLine(assembly.FullName);
Type type = assembly.GetType( "SortClasses.SortT`1" ); //得到此类类型 注:(`1) 为占位符 不明确类型
Type t = type.MakeGenericType(typeof(int)); //指定泛型类
object obj = assembly.CreateInstance(t.FullName); //创建其实例
MethodInfo mi = t.GetMethod( "BubbleSort" ); //调用方法
object [] argss = { array }; //参数
object returnValue = mi.Invoke(obj, argss); // 触发此方法
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}