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的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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值