小菜刚刚入驻博客园,也不知道该写点什么,因为知道这里高手如云,所以来这向各位高手讨经!还希望各位前辈多多指教!
因为前天突然谈到反射这个话题,所以小菜把一些碰到的问题跟大家分享下,希望大家别见笑!
闲话不多说,进入主题!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.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,该怎么传?????
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.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> 该怎么传入,因为他并不是具体的某个类,而是一个不确定的类型。
代码贴上:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.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。