反射(二)
来源:互联网 发布:关羽评价知乎 编辑:程序博客网 时间:2024/06/05 13:25
一.动态创建对象
构造函数无参数构造对象
class MyClass
{
privatestring _name;
publicstring Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
class Program
{
staticvoid Main(string[] args)
{
Assembly myass = Assembly.GetExecutingAssembly();//获取程序集
MyClass my = myass.CreateInstance("ConsoleApplication7.MyClass",true) as MyClass;//创建程序集中类型的实例方法一,CreateInstance,参数分别为类型名称和是否大小写无关。
my.Name = "rxm";
Console.WriteLine(my.Name);
ObjectHandle handle = Activator.CreateInstance(null,"ConsoleApplication7.MyClass");//创建程序集中类型的实例方法二,CreateInstance,参数分别为程序集名称(null表示当前),类型名称。
MyClass mynew = handle.Unwrap()as MyClass;
mynew.Name = "bj";
Console.WriteLine(mynew.Name);
Console.Read();
}
}
构造函数有参数构造对象
namespace ConsoleApplication7
{
class MyClass
{
privatestring _name;
privatestring _id;
public MyClass(string id,string name)
{
this._id = id;
this._name = name;
}
publicstring ID
{
get
{
return _id;
}
}
publicstring Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
class Program
{
staticvoid Main(string[] args)
{
Assembly myass = Assembly.GetExecutingAssembly();//获取程序集
object[] parameters =new object[2]; //构造函数的列表集合
parameters[0] = "001";
parameters[1] = "rxm";
MyClass obj = myass.CreateInstance("ConsoleApplication7.MyClass",true, BindingFlags.Default,null, parameters, null,null) as MyClass;
Console.WriteLine(obj.Name);
Console.WriteLine(obj.ID);
Console.Read();
}
}
}
二.动态调用方法
如果根据以上获得MyClass对象进行方法的调用,就和常规的方法调用一样了。
下面主要是通过.Net Reflection的方法实现。
namespace ConsoleApplication1
{
class MyClass
{
public int Add(int a, int b)
{
return a + b;
}
public static int square(int num)
{
return num * num;
}
}
class Program
{
static void Main(string[] args)
{
Assembly ass = Assembly.GetExecutingAssembly();
object obj = ass.CreateInstance("ConsoleApplication1.MyClass",true);
Type t = typeof(MyClass);
object[] parameters =new object[2];
parameters[0] = 3;
parameters[1] = 4;
int result = (int)t.InvokeMember("Add",BindingFlags.InvokeMethod, null, obj, parameters);//参数解析:方法名,说明调用的是个方法(也可以是字段/属性等),一个对象(该对象定义一组属性并启用绑定),非静态方法要说明是哪个对象调用,参数组。
//实例方法调用
MethodInfo addMethord = t.GetMethod("Add",BindingFlags.Instance | BindingFlags.Public);//获得一个方法。参数解析:方法名,方法描述(public的和可实例化的)。
int result_invoke = (int)addMethord.Invoke(obj, parameters);//根据得到的方法Invoke结果(对象实例,参数列表[没有为null])
//静态方法调用
MethodInfo squMethod = t.GetMethod("square",BindingFlags.Static | BindingFlags.Public);//静态的,public的
object[] staticParameters =new object[] { 9 };
Console.WriteLine((int)squMethod.Invoke(t, staticParameters));//81//由于是静态方法,参数一应该是属于的类型,或直接为null(不属于任何实例)
Console.WriteLine((int)squMethod.Invoke(null, staticParameters));//81
Console.WriteLine(result_invoke.ToString());
Console.WriteLine(result.ToString());
Console.Read();
}
}
}
- 反射(二)反射工厂
- C#反射(二)
- 反射应用(二)
- 反射(二) 笔记
- C#反射(二)
- 反射(二)
- 反射:reflect(二)
- java反射(二)
- 反射应用(二)
- 反射(二)
- (二)JDBC反射
- 反射(二)
- Java 反射(二)
- 反射机制(二)
- (二十二)反射
- Java反射(二):反射的使用
- C#反射机制(二)
- Java的反射(二)
- 触屏手机网站设计
- HTML中Form表单提交时,采用 GET和POST的区别 .
- 数据库方面的好文章收藏
- centos虚拟机NAT静态IP设置
- Ubuntu server安装经验
- 反射(二)
- 连接数据库
- SpringMVC+highstock实现曲线报表
- android相对布局中控件的常用属性【转】
- cocos2d各种动作的使用(变色、跳动、旋转、闪烁、悬挂、放大缩小、渐变、animation)
- hibernate用原生sql, SqlQuery查询找不到列
- 深入浅出Win32多线程设计之MFC的多线程
- Silverlight WCF RIA服务(五)使用SL商业应用模板
- WZ132发现打CXY要么是程序员,要么是丑小鸭