C#学习总结—反射的基本应用
作用1,在运行时操作某个类型的元数据
两种方法实现
实例.GetType()
typeof(类型)
注:一个类型只有一个type(反射能打破类封装的限制)
class A
{
}
var a = new A();
var type1 = typeof(A);
var type2 = a.GetType();
改变类中的属性—通过字符串配置调用属性
class A
{
public string MyProperty { get; set; }
public void Function(int a)
{
Console.WriteLine(a);
}
}
static void Main(string[] args)
{
var a = new A();
var type1 = typeof(A);
var type2 = a.GetType();
//调用属性
var property = type1.GetProperty("MyProperty");
property.SetValue(a, "aaa", null);
Console.WriteLine(a.MyProperty);
//调用方法
var function = type1.GetMethod("Function");
function.Invoke(a,new object[] {1});
Console.Read();
}
作用2,用户输入A,则执行A方法,用户输入B,则执行B方法
不用反射的做法
class A
{
public string MyProperty { get; set; }
public void Function(int a) {Console.WriteLine(a);}
public void A1() { }
public void B1() { }
}
static void Main(string[] args)
{
string input=Console.ReadLine();
var a = new A();
switch (input.ToLower())
{
case "a":
a.A1();
break;
case "b":
a.B1();
break;
}
}
使用反射的做法—通过字符串配置调用方法
class A
{
public string MyProperty { get; set; }
public void Function(int a)
{
Console.WriteLine(a);
}
public void A1() { Console.WriteLine("In function A1"); }
public void B1() { Console.WriteLine("In function B1"); }
}
static void Main(string[] args)
{
string input=Console.ReadLine();
var a = new A();
var type1 = typeof(A);
var property = type1.GetProperty("MyProperty");
property.SetValue(a, "aaa", null);
var function = type1.GetMethod(input);
function.Invoke(a, null);
Console.Read();
}
根据字符串创建类—在类上通过字符串加载方法
Assembly.Load(“程序集名称”).CreateInstance(“命名空间.类名”)—配合接口使用,封闭变化
interface MyInterface
{
void A1();
void B1();
}
public class A: MyInterface
{
public string MyProperty { get; set; }
public void Function(int a)
{
Console.WriteLine(a);
}
public void A1() { Console.WriteLine("In function A.A1"); }
public void B1() { Console.WriteLine("In function A.B1"); }
}
public class B : MyInterface
{
public string MyProperty { get; set; }
public void Function(int a)
{
Console.WriteLine(a);
}
public void A1() { Console.WriteLine("In function B.A1"); }
public void B1() { Console.WriteLine("In function B.B1"); }
}
class Program
{
static void Main(string[] args)
{
string input1=Console.ReadLine();
string input2 = Console.ReadLine();
var instance = (MyInterface)System.Reflection.Assembly.Load("委托事件").CreateInstance("委托事件."+input1);
var function = instance.GetType().GetMethod(input2);
function.Invoke(instance, null);
Console.Read();
}
}