调用反射类型中的函数一种是 使用 动态类型 dynamic 直接调用,这里对这种方法不深究
注意 : 反射查找 泛型类的时候 需要指定 占位符 如
var genericType = dll.GetType("TryRef.GenericCls`1");
这是有一个类型参数的情况 ,
但是 获取泛型方法不能添加占位符 直接就是 方法的名字
var method1 = commonType.GetMethod("GenericMethod");
dll中的目标类:
namespace TryRef
{
class PrivMethod
{
public void Method(string str)
{
Console.WriteLine($"我是一个普通方法:{str}!");
}
private void PrivateMethod(string str)
{
Console.WriteLine($"我是一个私有方法:{str}!");
}
static public void StaticMethod(string str)
{
Console.WriteLine($"我是一个静态方法:{str}!");
}
public void GenericMethod<T>(T pram)
{
Console.WriteLine($"我是一个泛型方法:{pram.GetType().Name}!");
}
}
调用实例:
class Program
{
// public static string dllName = ConfigurationSettings.AppSettings["dllName"];
static void Main(string[] args)
{
var dll = Assembly.Load("TryRef");
var commonType = dll.GetType("TryRef.PrivMethod");
var commonObj = Activator.CreateInstance(commonType);
//普通方法
{
var method1 = commonType.GetMethod("Method");
var ret = method1.Invoke(commonObj, new object[] { "123" });
}
//私有方法------>反射是可以突破限制调用私有方法的
{
var method1 = commonType.GetMethod("PrivateMethod", BindingFlags.Instance | BindingFlags.NonPublic );
var ret = method1.Invoke(commonObj, new object[] { "123" });
}
//静态方法------>
{
var method1 = commonType.GetMethod("StaticMethod");
var ret = method1.Invoke(commonObj, new object[] { "123" });
var ret2 = method1.Invoke(null, new object[] { "123" });
}
//泛型方法------>
{
var method = commonType.GetMethod("GenericMethod");
var makeTypeMethod = method.MakeGenericMethod(new Type[] { typeof(string) });
var ret = makeTypeMethod.Invoke(commonObj, new object[] { "123" });
}
//如果不知道类中有哪些方法以及方法需要的参数可以使用以下代码
//{
// foreach (var item in commonType.GetMethods())
// {
// Console.WriteLine($"************方法名称:{item.Name} ***************");
// foreach (var t in item.GetParameters())
// {
// Console.WriteLine($"参数类型:{t.ParameterType}");
// }
// }
//}
Console.ReadLine();
}