当前位置: 首页 > news >正文

C# 反射和特性练习代码

 反射


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}
}

反射特性

类库

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() { }}
}

特性

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的TypeType attribute = a.GetType("ClassLibrary1.PlayerAttribute");if (field.GetCustomAttribute(attribute) != null){//通过得到的特性Type来判断field成员有没有该特性//有的话Console.WriteLine("不能修改该成员");}else{   //没有就可以设置名字field.SetValue(obj, "好名字");Console.WriteLine(field.GetValue(obj));}}
}


http://www.mrgr.cn/news/17175.html

相关文章:

  • JVM内存模型简述
  • 【C++篇】~类和对象(上)
  • 浅谈C# 抽象类和抽象方法
  • 捷达千里江山首发亮相,捷达品牌2024成都车展继续宠粉不停
  • 【Android】Material Design编写更好的UI
  • 为什么越来越多的IT青年转行网络安全?
  • 台式机CPU温度90℃以上-排查思路
  • 快速了解Git 文件的四种状态及其操作指令、如何忽略文件
  • 考试知识点查缺补漏
  • docker实战基础四
  • codetest
  • 【5G PHY】5G循环前缀(CP)设计思路简述
  • 145. 利用 Redis Bitmap实践: 用户签到统计
  • World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Arathi Basin
  • vue3+elementplus的表格展示和分页实战
  • 【Kubernetes知识点问答题】Kubernetes 部署(一)
  • 小柴带你学AutoSar系列三、标准和规范篇(3)ModeManagement
  • 存储系统总结
  • 如何安装Docker
  • 【MySQL进阶】索引性能分析