反射
反射
1.调用的简单步骤
Assembly asse = Assembly.Load("MakeDinner");//动态加载DLL
Type type = asse.GetType("MakeDinner.chef");//获取类型信息 注意 一定要指定到类名
object objInstance = Activator.CreateInstance(type);//创建对象
return ((chef)objInstance).cook();
2.反射一般也要结合面向接口编程思想使用。
Assembly asse = Assembly.LoadFile(@"D:\01Project\12学习实战项目\01知识点练习\01WebSite\bin\CommonSearch.Google.dll");
object objInstance = asse.CreateInstance("ISearchByKeyword");
return ((ICommon.ISearchByKeyword)objInstance).Search("爱爱");
调用的时候只使用接口
3.ioc=简单对象创建工厂+配置文件+反射
4.对象是通过构造函数创建的,可以通过私有构造函数并提供属性暴露已创建对象的方法创建单例对象。反射的话可以通过参数获取到对象的私有方法,从而可以达到破坏单例的效果。
5.MVC就是通过反射动态获取方法的方式实现的。
6.动态调用方法的Demo
//动态调用方法 //重载的方法的处理方式就是通过GetMethod第二个参数Type数组来指定
object objInstance = Activator.CreateInstance(type);
MethodInfo[] methodInfo = type.GetMethods();
foreach (var item in methodInfo)
{
if (item.Name.Equals("cook"))
{
var rel = item.Invoke(objInstance, new object[] { });
sb.Append(rel.ToString());
sb.Append("<br/>");
}
else if (item.Name.Equals("cookPersonalized"))
{
//(黑科技)获取一下菜谱
MethodInfo mi = type.GetMethod("cookDetailPersonalized", BindingFlags.NonPublic | BindingFlags.Instance);
var rel = mi.Invoke(objInstance, new object[] { "日本" });
sb.Append(rel.ToString());
sb.Append("<br/>");
rel = item.Invoke(objInstance, new object[] { "日本" });
sb.Append(rel.ToString());
sb.Append("<br/>");
}
else if (item.Name.Equals("cookPersonalizedPay"))
{
var rel = item.Invoke(objInstance, new object[] { "日本", 1000 });
sb.Append(rel.ToString());
sb.Append("<br/>");
}
7.动态获取与设置属性
PropertyInfo[] pi = type.GetProperties();
foreach (var item in pi)
{
if (item.Name.Equals("CookerName"))
{
item.SetValue(objInstance, "吕春城");
}
var rel = item.GetValue(objInstance);
sb.Append(item.Name + ":" + rel);
sb.Append("<br/>");
}