反射存取参数测试

本文介绍了使用C#反射API获取`MyClass`中的公共、私有和受保护内部属性的方法,以及如何获取字段和属性的详细信息,包括名称、类型和访问权限。
摘要由CSDN通过智能技术生成
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ReflectionTest
{
    public class MyClass
    {
        public int PublicProperty { get; set; }
        private string PrivateProperty { get; set; }
        protected internal bool ProtectedInternalProperty { get; }

        public string Name;

        private string value;

        public readonly double ReadOnlyProperty = 3.14; 
        public event EventHandler FieldChanged;
        public event EventHandler PropertyChanged;
    }
    /// <summary>
    /// 字段属性信息
    /// </summary>
    public class ParamsInfo
    {

        /// <summary>
        /// 身份识别名字一般要求一个对象内所有元素相同且不能和其他对象重复
        /// </summary>
        public string IdName;
        /// <summary>
        /// 变量名称
        /// </summary>
        public string Name;
        public string TypeName;
        /// <summary>
        /// 说明姓名一般中文名字
        /// </summary>
        public string DescName;
        /// <summary>
        /// 父类名称
        /// </summary>
        public string FatherName;
        public string StringValue;
        public bool IsPublic;
        /// <summary>
        /// 可写的,参数存取需要可写
        /// </summary>
        public bool CanWrite;
        public bool IsField;       
        public bool IsProperty;
   

    }
    internal class Class1
    {
        public void GetProperty(object myobj)
        {
            Type type = myobj.GetType();

            // 获取MyClass的所有属性  
            PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            foreach (PropertyInfo property in properties)
            {
                // 输出属性名  
                Console.WriteLine("属性名: " + property.Name);

                // 输出属性类型  
                Console.WriteLine("属性类型: " + property.PropertyType);



                // 判断属性是否可读  
                if (property.CanRead)
                    Console.WriteLine("属性是可读的");
                else
                    Console.WriteLine("属性是不可读的");

                // 判断属性是否可写  
                if (property.CanWrite)
                    Console.WriteLine("属性是可写的");
                else
                    Console.WriteLine("属性是不可写的");

                Console.WriteLine();
            }
        }
        /// <summary>
        /// 获取所有需要的信息
        /// </summary>
        /// <param name="myobj"></param>
        /// <param name="requireinfo"></param>
        public void GetAllParams(object myobj, out List<ParamsInfo> minfos, bool findPublic = true, bool findField = true, bool findProperty = true, bool findStatic = false)
        {
            BindingFlags bindingFlags = findPublic ? BindingFlags.Public : BindingFlags.IgnoreReturn;
            bindingFlags |= findField ? BindingFlags.GetField  : BindingFlags.IgnoreReturn;
            bindingFlags |= findProperty ? BindingFlags.GetProperty : BindingFlags.IgnoreReturn;
            bindingFlags |= findStatic ? BindingFlags.Static : BindingFlags.IgnoreReturn;
            GetAllParams(myobj, bindingFlags,out  minfos);
        }
        public void GetAllParams(object myobj, BindingFlags bindingFlags, out List<ParamsInfo> minfos)
        {
            minfos = new List<ParamsInfo>();
            if (myobj == null)
            {
                Console.WriteLine("GetAllParams输入对象空: ");
                return;
            }


            Type myobjType = myobj.GetType();

            MemberInfo[] members = myobjType.GetMembers(bindingFlags);
            if ((members?.Length ?? 0) < 1)
            {
                Console.WriteLine("GetAllParams输入对象不包含内容: ");
                return;
            }
          
            foreach (var mb in members)
            {
                ParamsInfo curinfo = new ParamsInfo();
                curinfo.Name = mb.Name;
                curinfo.IsPublic = mb.GetType().IsPublic;
                curinfo.TypeName = mb.GetType().Name;
                if (mb is PropertyInfo pp)
                {
                    curinfo.IsProperty = true;
                    curinfo.StringValue = pp.GetValue(myobj).ToString();//这里需要做处理序列化为字符串
                }
                else if (mb is FieldInfo fd)
                {
                    curinfo.IsField = true;
                    curinfo.StringValue = fd.GetValue(myobj).ToString();//这里需要做处理序列化为字符串
                }
                minfos.Add(curinfo);
            }





        }
    }
  
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值