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)
{ 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]);
}
假设2中出自博客园中http://m.cnblogs.com/67560/1683466.html的代码
其它参考资料:http://msdn.microsoft.com/zh-cn/library/ms173128(VS.80).aspx