关于.Net反射泛型类的一些资料

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

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

   闲话不多说,进入主题!

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   

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,该怎么传?????

   

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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> 该怎么传入,因为他并不是具体的某个类,而是一个不确定的类型。

     代码贴上:

   

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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。

 

 

 

 

 

  

转载于:https://www.cnblogs.com/fengfengdiandian/archive/2010/03/11/1683466.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值