反射的相关知识点

namespace 反射
{
class Program
{
//创建了类库,在文件中会生成bin--Debug 的文件夹存储Dll的文件夹
//using System.Reflection; 反射为了动态
//反射的原理:类库编译后生成dll(应用和程序的扩展)和pdb(Program Debug Databases)文件
//dll包含:IL( 中间语言),metadata(元数据)对IL的描述
//Reflection 读取元数据知道IL或者Dll有哪些类和属性
//通过反射获取dll信息,创建对象,调用方法
static void Main(string[] args)
{
#region 写死的引用接口

接口 可以实例化一个继承他的类
//IDBHelper dbHelper = new DBHelper();
//dbHelper.Query();

#endregion
#region 动态加载反射
1.先加载 2.找类型 3.创建对象 4.类型转换
反射的入口,动态加载dll
反射可以灵活的调用配置的文件
//Assembly assembly = Assembly.Load("Ruanmou.DB.Sqlserver");
//Console.WriteLine("*************Reflection*********************");
//foreach (Module item in assembly.GetModules())
//{
// //展示的这些数据都来自元数据,
// Console.WriteLine("名称{0}", item.FullyQualifiedName);
//}
//Console.WriteLine("*************GetMOdules*********************");
//foreach (Type item in assembly.GetTypes())
//{
// Console.WriteLine("名称{0}", item.FullName);
//}
//Console.WriteLine("*************创建对象*********************");
基于类的完整名称 找出类型
1.先加载 2.找类型 3.创建对象 4.类型转换
//Type dbHelperType = assembly.GetType("Ruanmou.DB.Sqlserver.DBHelper");
根据类型创建对象
1.先加载 2.找类型 3.创建对象 4.类型转换
//object oDbHelper = Activator.CreateInstance(dbHelperType);
//Console.WriteLine(oDbHelper);
Is 是判断类型对不对
//IDBHelper dbHelperReflection = (IDBHelper)oDbHelper;
1.先加载 2.找类型 3.创建对象 4.类型转换 5. 调用方法
//dbHelperReflection.Query();//完成方法的调用
//Console.ReadKey();
#endregion

People people = new People();
people.Id = 132;
people.Name = "猪八戒";

//如果通过反射来施行
//1.找到类型
Type type=typeof(People);
//2.找到类型,创建对象
object oObject = Activator.CreateInstance(type);//Activator:包含特定的方法,用以在本地或远程创建类型

foreach (var item in type.GetProperties())//type.GetProperties()找出所有类型的所有属性
{
if (item.Name.Equals("Id"))
{
item.SetValue(oObject, 12);//可以给对象赋值 SetValue赋值
}
if(item.Name.Equals("Name"))
{
item.SetValue(oObject,"煮开你");
}

Console.WriteLine("属性名称{0},值是{1}", item.Name, item.GetValue(oObject));//GetValue 获取
//属性名称Id,值是0,,,,,,,Activator.CreateInstance(type)创建的默认值是0和null(诺)
//属性名称Name,值是null
}

DBHelper dbHelper = new DBHelper();
Users user= dbHelper.QueryDomain<Users>();


Console.ReadLine();

}
}
}

=============================================

namespace Ruanmou.DB.Interface
{
public interface IDBHelper
{
void Query();
}
}

==============================================

namespace Ruanmou.DB.Sqlserver
{
public class DBHelper : IDBHelper
{

private static string ConnectionString = ConfigurationManager.ConnectionStrings["xxxx"].ConnectionString;

public DBHelper()
{
Console.WriteLine("这里是{0}的无参数构造函数", this.GetType().FullName);
}
public void Query()
{
//this指的是Ruanmou.DB.Sqlserver.DBHelper 当前类
Console.WriteLine("这里是{0}的Query", this.GetType().FullName);
}


public T QueryDomain<T>()
{
Type type=typeof(T);
T t = (T)Activator.CreateInstance(type);//创建对象
foreach (var item in type.GetProperties())//type.GetProperties()找出所有类型的所有属性
{
Console.WriteLine("属性名称{0},值是{1}", item.Name);//得到type里所用的字段

}
//将所有的属性的名字链接起来并且给每一个字段加了中括号,加中括号可以过滤关键字
string colums = string.Join(",",type.GetProperties().Select(p=>string.Format("[{0}]",p.Name)));
/*
SELECT TOP 1000 [ID]
,[UserName]
,[UserPwd]
,[Age]
,[Email]
,[Birth]
,[UserImg]
,[Gender]
,[UserTypeName]
,[MvcUserTypeID]
FROM [MVC1].[dbo].[MvcUsers]
*/
int id = 2;
string sql =string.Format( "select {0} from {1} where id={2}",colums,type.Name,id);
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
SqlCommand command = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
if (reader.Read())
{
foreach (var item in type.GetProperties())//type.GetProperties()找出所有类型的所有属性
{
string propName = item.Name;
item.SetValue(t,reader[propName]);
Console.WriteLine("属性名称{0},值是{1}", item.Name, item.GetValue(t));//GetValue 获取
}
}
}

return default(T);
}

}
}

======================================================================

namespace Ruanmou.Model
{
public class People
{
public People()
{
Console.WriteLine("{0}被创建",this.GetType().FullName);
}
public int Id { set; get; }
public string Name { set; get; }
}
}

转载于:https://www.cnblogs.com/ZkbFighting/p/7612031.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值