项目中常常要用到反射,反射对性能有一定的影响,但有时候为了通用,扩展等不的不使用。下面简单的说一下。
TestLib.dll里面有这样一个类
namespace TestLib
{
public class TestInstanceClass
{
public string F = "F";
public int Test()
{
return 250;
}
public int TestArg(int returnvalue)
{
return returnvalue;
}
}
public class TestStaticClass
{
public static int Test()
{
return 250;
}
public static int TestArg(int returnvalue)
{
return returnvalue;
}
}
}
下面是反射调用,先加载程序集,并创建类的实例
string path = "TestLib";
//实例类,静态类的反射差别不大
var assembly = Assembly.Load(path);//名字不用加.dll
//assembly = Assembly.LoadFile(path+"TestLib.dll");//加载文件绝对路径
//推荐使用Load,LoadFile多个dll路径不一样可能会重复加载
var instance = assembly.CreateInstance("TestLib.TestInstanceClass");
下面是调用方法:
//无参方法
var method = instance.GetType().GetMethod("Test");
var result = method.Invoke(instance, null);//第二个可以是参数
//测试带参数的
var methodWithArg = instance.GetType().GetMethod("TestArg");
var resultArg = methodWithArg.Invoke(instance, new object[] { 2500 });//第二个可以是参数
//4.0 dynamic 调用
dynamic dynamicInstance = assembly.CreateInstance("TestLib.TestInstanceClass");
var dynamicResult = dynamicInstance.Test();
var dynamicResultWithAerg = dynamicInstance.TestArg(100);
Console.WriteLine(result);//print 250
Console.WriteLine(resultArg);//print 2500
// dynamic 结果
Console.WriteLine(dynamicResult);//print 250
Console.WriteLine(dynamicResultWithAerg);//print 100
下面是字段:
//获取字段,设置值
var field = instance.GetType().GetField("F");
field.SetValue(instance, "testF");//静态类的话,instance也可以Null
var value = field.GetValue(instance);//静态类的话,instance也可以Null
Console.WriteLine(value);
//4.0 dynamic对象可以直接点
dynamicInstance.F = "dynamictestF";//直接设置值
Console.WriteLine(dynamicInstance.F