反射
cs
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata.Ecma335;
using System.Runtime;
class Test
{
private int b;
public int a = 1;
public string str = "123";
public Test() { b = 5; }
public Test(int b)
{
this.b = b;
}
public Test(int a, string str)
{
this.a = a;
this.str = str;
}
public void Speak(int a)
{
Console.WriteLine("{0}说话了",a);
}
}
class Program
{
public static void Main()
{
Type type = typeof(Test);
Console.WriteLine(type.Assembly);
//获取类中的所有公共成员
MemberInfo[] info = type.GetMembers();
for (int i = 0; i < info.Length; i++)
{
Console.WriteLine(info[i]);
}
Console.WriteLine("00000000000000000");
//获取所有公共构造函数
ConstructorInfo[] ctor = type.GetConstructors();
for (int i = 0; i < ctor.Length; i++)
{
Console.WriteLine(ctor[i]);
}
Console.WriteLine("111111111111111111");
//得到无参构造并执行
ConstructorInfo ctorinfo1 =type.GetConstructor(new Type[0]);
Test a = ctorinfo1.Invoke(null)as Test;
Console.WriteLine(a.str);
Console.WriteLine("2222222222222222222");
//得到有参构造并执行
ConstructorInfo ctorinfo2 =type.GetConstructor(new Type[] {typeof(int), typeof(string)});
Test b = ctorinfo2.Invoke(new object[] {666,"999"})as Test;
Console.WriteLine(b.str);
Console.WriteLine("33333333333333333333");
//得到所有公共成员变量
FieldInfo[] fieldInfos = type.GetFields();
for (int i = 0; i < fieldInfos.Length; i++)
{
Console.WriteLine(fieldInfos[i]);
}
Console.WriteLine("444444444444444444444");
//得到指定名称成员变量
FieldInfo info1 = type.GetField("str");
Console.WriteLine(info1);
Console.WriteLine("555555555555555555555");
//通过反射获取和修改对象的值
Test test = new Test(12,"693");
Console.WriteLine(info1.GetValue(test));
Console.WriteLine("6666666666666666666666");
//设置
info1.SetValue(test, "100");
Console.WriteLine(info1.GetValue(test));
Console.WriteLine("7777777777777777777777");
//获取类的公共成员方法
MethodInfo[] MInfos = type.GetMethods();
for (int i = 0; i < MInfos.Length; i++)
{
Console.WriteLine(MInfos[i]);
}
// 调用类中的方法 (让他说话真tm难)
//MethodInfo 的Invoke 方法 第一个参数是要调用方法的类,第二个参数是方法要用的参数们
MethodInfo speak = type.GetMethod("Speak",
new Type[] {typeof(int)});
ConstructorInfo constructorInfo =type.GetConstructor(new Type[0] );
speak.Invoke((constructorInfo.Invoke(null) as Test),new object[]{ 911});
//Activator
}
}
反射特性
类库
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary1
{
class PlayerAttribute : Attribute
{
public PlayerAttribute()
{
}
}
internal class Player
{
[Player()] public string Name;
public int Atk;
public int Hp ;
public int Def ;
public int posX;
public int posY;
public Player() { }
}
}
特性
cs
using System.Reflection;
class Program
{
public static void Main()
{
Assembly a = Assembly.LoadFrom(@"E:\应用 。。。\Visual Studio 2022\WWWWorks\Advanced\ClassLibrary1\bin\Debug\ClassLibrary1");
Type[] Type = a.GetTypes();
for (int i = 0; i < Type.Length; i++)
{
Console.WriteLine(Type[i]);
}
Type player = a.GetType("ClassLibrary1.Player");
MemberInfo[] Minfo= player.GetMembers();
foreach (MemberInfo mi in Minfo)
{
Console.WriteLine(mi);
}
FieldInfo field = player.GetField("Name");
object obj = Activator.CreateInstance(player);
//得到PlayerAttribute的Type
Type attribute = a.GetType("ClassLibrary1.PlayerAttribute");
if (field.GetCustomAttribute(attribute) != null)
{
//通过得到的特性Type来判断field成员有没有该特性
//有的话
Console.WriteLine("不能修改该成员");
}
else
{ //没有就可以设置名字
field.SetValue(obj, "好名字");
Console.WriteLine(field.GetValue(obj));
}
}
}