小菜刚刚入驻博客园,也不知道该写点什么,因为知道这里高手如云,所以来这向各位高手讨经!还希望各位前辈多多指教!

   因为前天突然谈到反射这个话题,所以小菜把一些碰到的问题跟大家分享下,希望大家别见笑!

   闲话不多说,进入主题!

 

代码

static Assembly assembly = Assembly.Load("反射机制【反射对象F】");

static void Main(string[] args)
{



Dictionary
<string, string> properties = new Dictionary<string, string>();
properties.Add(
"Name", "疯子");
properties.Add(
"Age", "21");
properties.Add(
"Sex", "");


//=======================================================================
//反射对象属性并赋值
//=======================================================================



#region 【反射对象属性】


object students = assemb.CreateInstance("反射机制_反射对象F_.Student");

PropertyInfo[] pro
= student.GetType().GetProperties();

foreach (PropertyInfo p in pro)
{
p.SetValue(student, Convert.ChangeType(properties[p.Name], p.PropertyType),
null);
}


foreach (PropertyInfo p in pro)
{
Console.WriteLine(p.Name
+ ": " + p.GetValue(student, null));
}

Console.ReadKey();


#endregion

 

这段代码当然很简单,就是通过 Assembly 这个类加载一个程序集,然后再创建Student的实例。

当然我这里没用到数据库,所以直接定义了一个键值队,方便赋值。

然后再通过GetValue()方法取值,当然这些意义不大。

 

   关键是上次突然讨论到泛型这个话题,然后就在那想了,如果反射的对象是个泛型类????

   这个T,该怎么传?????

   

代码
public class TestMethod<T> where T: IComparable
{

public T[] SetSort(T[] array)
{
for (int i = 0; i < array.Length - 1; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if ((array[i].CompareTo(array[j])) < 0)
{
T temp;
temp
= array[i];
array[i]
= array[j];
array[j]
= temp;
}
}
}
return array;
}



}

 

 

     这是小菜用来测试的一个泛型冒泡排序法,虽然代码写的有点龊,但是还是能看的  ~~ 

    恕小菜愚昧,就这个问题我是想秃顶了也没想出来,然后没办法,

    只有借助网络的力量~上百度,但是好像关于这方面的话题都没怎么讨论,而且我也查了很多网站,资料非常的零散。

    而且可读性也比较差,所以鄙人就做了一个自认为比较系统的例子,仅供大家参考。希望大家别喷。

 

    其实我们最大的问题就是如何反射出这个类,还有这个<T> 该怎么传入,因为他并不是具体的某个类,而是一个不确定的类型。

     代码贴上:

   

代码
static T[] TestGenericMethod<T>(T[] array)
{
Type type
= assembly.GetType("反射机制_反射对象F_.TestMethod`1");//得到此类类型 注:(`1) 为占位符 不明确类型

Type t
= type.MakeGenericType(typeof(T)); //指定泛型类型

object obj = assembly.CreateInstance(t.FullName); //创建其实力

MethodInfo mi
= t.GetMethod("SetSort"); //调用方法 SetSort:冒泡排序法【泛型方法】

object[] args = { array }; //参数

object returnValue = mi.Invoke(obj, args); //触发此方法。并且得到返回值


return (T[])returnValue;


}

 

  首先我们通过Assembly得到该类的类型, 记住TestMethod这是我写的一个测试类,后面的`1(`为1左边的键)为占位符,属于运行时绑定。

 当然如果是反射键值对的话<k,v> 那个1就是2咯,嘿嘿~~~,得到类型下面就好说了。

   然后我们通过Type.MakeGenericType()这个方法来指定<T>的类型,记住:前面做的都仅仅只是前期工作,指定类型。

   并没有得到这个类的具体实例,然后我们在通过Assembly的CreateInstance()方法创建它的实例。

  接下来就不说了~~

    以上方法只是小菜自己对泛型方法的一些理解,希望各位前辈还多多指教不对之处!  OVER。

 

 

 

 

 

  

posted on 2010-03-11 14:45  Crazy_ribs  阅读(1034)  评论(0编辑  收藏  举报