1、为什么需要反射:
最初使用反射的时候,既然可以通过new 一个对象的方式得到对象,然后通过对象去调用属性和方法,那么为什么还需要反射去调用呢?后来使用多了发现这就是一个先绑定还是后绑定的问题,很多初使用反射的开发人员通常都会有类似这种疑虑:既然在开发时就能够写好代码,干嘛还放到运行期去做,不光繁琐,而且效率也受影响。博主觉得主要是适用性的问题,如果你的系统没有那么高的扩展性和灵活性要求,你大可不必考虑反射。但在架构设计时,很多东西都需要考虑复用性,并且在某些特定的场景下你得不到具体的类时,你就必须用到反射。博主总结了下自己使用过的反射场景:
(1)有时不知道具体的类型,可以通过dll去得到类的对象;
(2)某些特殊方法,传过来的是泛型类,需要通过反射处理某些特殊的业务;
(3)通用方法DataTable和List<T>的相互转化时需要用到反射;
2:反射
反射dll 文件里面内容
先建个类
public class Class1
{
public Int32 Id { get; set; }
public Int32 TourId { get; set; }
private String Type { get; set; }
public Decimal Amount { get; set; }
public String Description { get; set; }
public Int32 DescripOrder { get; set; }
public Boolean IsTotal { get; set; }
}
生成之后 找到文件路径
反射方法:
public static void fanshe()
{
var strDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "G:\\新建文件夹 (2)\\新建文件夹\\testm\\mod\\bin\\Debug\\mod.dll");
var oAssembly = Assembly.LoadFile(strDllPath);
var lstTypes = oAssembly.GetTypes();
foreach (var oType in lstTypes)
{
if (oType.Name == "Class1")
{
//默认得到类下面的所有public成员
var lstMembers = oType.GetMembers();
foreach (var oMem in lstMembers)
{
Console.WriteLine("GetMembers()方法得到的成员名称:" + oMem.Name);
}
Console.WriteLine("");
//默认得到类下面的所有public属性
var lstProperty = oType.GetProperties();
foreach (var oProp in lstProperty)
{
Console.WriteLine("GetProperties()方法得到的成员名称:" + oProp.Name);
}
Console.WriteLine("");
//默认得到类下面的所有public字段
var lstField = oType.GetFields();
foreach (var oField in lstField)
{
Console.WriteLine("GetFields()方法得到的public成员名称:" + oField.Name);
}
//默认得到类下面的所有public字段
var lstField2 = oType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var oField in lstField2)
{
Console.WriteLine("GetFields()方法得到的私有成员成员名称:" + oField.Name);
}
}
}
}
static void Main(string[] args)
{
fanshe();
Console.ReadKey();
}
具体反射出来什么成员 可以通过这个BindingFlags去设置
反射对象:
public static T GetModel<T>(T oModel)
{
var model = default(T) ;
//得到对象的方法一:
model = (T)typeof(T).GetConstructor(new System.Type[] { }).Invoke(new object[] { });//反射得到泛型类的实体
//得到对象的方法二:
model = (T)Activator.CreateInstance(typeof(T));
//逻辑处理......
return model;
}
list转table
//List集合转换为DataTable
public static DataTable ListFillTable(object obj)
{
if (!(obj is IList))
{
return null;
}
var objlist = obj as IList;
if (objlist == null || objlist.Count <= 0)
{
return null;
}
var tType = objlist[0];
DataTable dt = new DataTable(tType.GetType().Name);
DataColumn column;
DataRow row;
System.Reflection.PropertyInfo[] myPropertyInfo = tType.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var t in objlist)
{
if (t == null)
{
continue;
}
row = dt.NewRow();
for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
{
System.Reflection.PropertyInfo pi = myPropertyInfo[i];
string name = pi.Name;
if (dt.Columns[name] == null)
{
var coltype = pi.PropertyType;
if (coltype.Name == "Nullable`1")
{
//coltype = typeof(System.DBNull);
column = new DataColumn(name);
}
else
{
column = new DataColumn(name, coltype);
}
dt.Columns.Add(column);
}
row[name] = pi.GetValue(t, null);
}
dt.Rows.Add(row);
}
return dt;
}