反射 —普通类、带泛型的类、带泛型的类与带泛型的方法
public class GeneralClass
{
public string GetName(string name)
{
Console.WriteLine($"{name}");
return $"{name}";
}
}
public class GenericMthod
{
public string GetName<T1, T2>(T1 name, T2 sex)
{
Console.WriteLine($"{name}{sex}");
return $"{name}{sex}";
}
}
public class GenericClassAndMethod<T>
{
public string GetName<T1, T2>(T1 name, T2 sex)
{
Console.WriteLine($"{name}{sex}");
return $"{name}{sex}";
}
public void Get()
{
}
}
class Program
{
static void Main(string[] args)
{
// 普通类/普通方法
{
// 获取类
var type = typeof(GeneralClass);
//获取方法
var method = type.GetMethod("GetName");
// 创建实例
var obj = Activator.CreateInstance(type);
// 参数
var paramaters = new object[] { "111" };
// 执行
method.Invoke(obj, paramaters);
}
{
var type = typeof(GenericMthod);
var genericMthod = type.GetMethod("GetName");
// 指定泛型方法中泛型参数的类型 ,这里指定 GetName<T1,T2>中T1 的类型为string,T2为int , 不指定会报错
var genericMthods = genericMthod.MakeGenericMethod(typeof(string), typeof(int));
var obj = Activator.CreateInstance(type); // 创建实例
var paramaters = new object[] { "hnzheng", 11111 }; // 对应的泛型参数值
genericMthods.Invoke(obj, paramaters); // 执行方法
}
{
var type = typeof(GenericClassAndMethod<>);
// var genericMthod = type.GetMethod("GetName");
// 创建泛型实例
var ntype = type.MakeGenericType(typeof(int));//指定GenericClassAndMethod<T> T的类型
var genericMthod = ntype.GetMethod("GetName"); // 这里要用泛型类型去获取 泛型方法,如果使用type.GetMethod("GetName");会报错
var obj = Activator.CreateInstance(ntype); // 创建实例
// 调用非泛型方法
var method = ntype.GetMethod("Get");
method.Invoke(obj, null);
// 调用泛型方法
// 指定泛型方法中泛型参数的类型 ,这里指定 GetName<T1,T2>中T1 的类型为string,T2为int , 不指定会报错
var genericMthodss = genericMthod.MakeGenericMethod(typeof(string), typeof(int));
// 指定参数
var paramaters = new object[] { "hnzheng", 11111 }; // 对应的泛型参数值
//genericMthodss.Invoke(null, null);
genericMthodss.Invoke(obj, paramaters); //
//
}
1、 mvc 其实 也是利用反射,action重载比较麻烦,无法判断调用那个方法,只能通过httpmethod 来区分
2、 AOP