C#中反射泛型CreateInstance
假设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)typeof 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]);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。