C# 反射和特性练习代码

反射

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));
        }
    }
}
相关推荐
码观天工3 分钟前
.NET 原生驾驭 AI 新基建实战系列(五):Milvus ── 大规模 AI 应用的向量数据库首选
c#·.net·milvus·向量数据库·高性能
猫猫头有亿点炸25 分钟前
C语言大写转小写2.0
c语言·开发语言
A达峰绮34 分钟前
设计一个新能源汽车控制系统开发框架,并提供一个符合ISO 26262标准的模块化设计方案。
大数据·开发语言·经验分享·新能源汽车
BS_Li44 分钟前
C++类和对象(上)
开发语言·c++·类和对象
XiaoyuEr_66881 小时前
C#中属性和字段的区别
开发语言·c#
火星papa1 小时前
C# 利用log4net 工作台打印和保存到文件
c#
ghost1431 小时前
C#学习第19天:多线程
开发语言·学习·c#
钢铁男儿1 小时前
C# 类的基本概念(声明类)
c#
Y1nhl1 小时前
力扣hot100_子串_python版本
开发语言·python·算法·leetcode·职场和发展
李宥小哥1 小时前
Redis03-基础-C#客户端
开发语言·缓存·中间件·c#