反射实例

Posted lhl123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射实例相关的知识,希望对你有一定的参考价值。

实例

StudentInfo
public class StudentInfo
    {
        public StudentInfo()
        {

        }
        public StudentInfo(string nickName)
        {
            _nickName = nickName;
        }

        public StudentInfo(int age)
        {
            Age = age;
        }


        private string _nickName = "张三";

        private bool _isfriend = true;

        public bool IsFriend
        {
            get { return _isfriend; }
            set { _isfriend = value; }
        }


        public int Age { get; set; }

        public string NickName
        {
            get
            {
                if (_isfriend)
                {
                    return _nickName;
                }
                else
                {
                    return "任我行";
                }
            }
            set { _nickName = value; }
        }

        /*
         * ToString,GetHashCode,GetType(),Equeal
         */

        public void Run()
        {
            Console.WriteLine($"{_nickName}我正在跑步...");
        }
    }
Console.WriteLine("************获取所有属性************");
                //获取类型
                Type t = typeof(StudentInfo);
                var props = t.GetProperties();
                foreach (var propertyInfo in props)
                {
                    Console.WriteLine(propertyInfo.Name);
                }

效果:

技术图片

Console.WriteLine("\\r\\n************获取所有方法************\\r\\n");
                /*
                 * 1.获取类型
                 * 2.GetMethods()
                 * 3.不包含构造方法
                 */
                var t = typeof(StudentInfo);
                var methods = t.GetMethods();
                foreach (var methodInfo in methods)
                {
                    Console.WriteLine(methodInfo.Name);
                }

                Console.WriteLine(methods.Length);

技术图片

Console.WriteLine("\\r\\n************获取类型名称************\\r\\n");
                var t = typeof(StudentInfo);
                Console.WriteLine(t.Name);
                Console.WriteLine(t.FullName);//包含命名空间

技术图片

Console.WriteLine("\\r\\n************获取字段************\\r\\n");
                var t = typeof(StudentInfo);
                var fields = t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
                foreach (var fieldInfo in fields)
                {
                    Console.WriteLine(fieldInfo.Name);
                }

技术图片

Console.WriteLine("\\r\\n************调用构造函数************\\r\\n");
                var t = typeof(StudentInfo);
                Type[] types = new Type[1];
                types[0] = typeof(string);//表示要获取参数类型为String的构造函数
                var cons = t.GetConstructor(types);
                //调用构造函数,并给构造传递参数值
                var student = cons.Invoke(new object[] { "任我行" }) as StudentInfo;
                Console.WriteLine(student.NickName);

技术图片

Console.WriteLine("\\r\\n************调用方法************\\r\\n");
                /*
                 * 1.获取类型
                 * 2.创建对象
                 * 3.调用方法
                 */
                var t = typeof(StudentInfo);
                object obj = Activator.CreateInstance(t, 999);
                var methodInfo = t.GetMethod("Run"); //获取需要调用的方法名称
                methodInfo.Invoke(obj, null);//调用Run方法,指定方法在哪个对象下被调用,null参数表示此方法是无参方法

技术图片

Singleton

 

public class Singleton
    {
        private string _nickName;
        public Singleton(string nickName)
        {
            _nickName = nickName;
        }

        public string NickName => _nickName;

        private void Run()
        {
            Console.WriteLine($"我是{_nickName},这是私有跑步方法");
        }
    }

 

Console.WriteLine("\\r\\n************调用私有方法************\\r\\n");
                //黑科技
                var t = typeof(Singleton);
                var obj = Activator.CreateInstance(t, "天道无情");
                var methodInfo = t.GetMethod("Run", BindingFlags.NonPublic | BindingFlags.Instance); //获取需要调用的方法名称
                methodInfo.Invoke(obj, null);//调用私有方法

技术图片

Console.WriteLine("\\r\\n************加载程序集************\\r\\n");
                Assembly assembly = Assembly.Load("反射");
                Type t = assembly.GetType("反射.StudentInfo");
                var obj = Activator.CreateInstance(t, "天道无情");

                var methodInfo = t.GetMethod("Run");
                methodInfo.Invoke(obj, null);//调用

技术图片

Console.WriteLine("\\r\\n************反射给属性赋值************\\r\\n");
                var t = typeof(StudentInfo);
                object obj = Activator.CreateInstance(t, 999);//创建对象
                var p = t.GetProperty("NickName");

                p.SetValue(obj, "范涛涛");//设置指定对象obj属性值
                var val = p.GetValue(obj);//获取指定对象obj属性值
                Console.WriteLine(val);

技术图片

配置文件中添加

<connectionStrings>
    <add name="Default" connectionString="server=127.0.0.1;database=WeekCodeFirst;uid=test1608;pwd=123456" providerName="System.Data.SqlClient"/>
  </connectionStrings>
public class DbHelper<T>
    {
        private static readonly string _connString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
        //新增
        public int Insert(T model)
        {
            int result = 0;
            var t = typeof(T);
            using (SqlConnection conn = new SqlConnection(_connString))
            {
                conn.Open();
                string strSql = "insert into 表名(字段1,字段2,字段3) values(@字段1,@字段2,@字段3)";
                StringBuilder sql = new StringBuilder();//用于字符串拼接的类
                sql.Append($"Insert into {t.Name}(");
                var props = t.GetProperties().ToList();
                props.RemoveAt(0);//移除了主键
                var names = props.Select(p => p.Name).ToList();
                sql.Append(string.Join(",", names));//将类型的所有属性用","号隔开,如:属性1,属性2....
                sql.Append($") values(@{string.Join(",@", names)})");
                result= conn.Execute(sql.ToString(),model);
            }
            return result;
        }
    }

CourseInfo

public class CourseInfo
    {
        public int Id { get; set; }
        public string CourseName { get; set; }
        public int TeacherId { get; set; }

    }
Console.WriteLine("\\r\\n************反射抽象添加数据************\\r\\n");
                DbHelper<CourseInfo> helper = new DbHelper<CourseInfo>();
                CourseInfo info = new CourseInfo()
                {
                    Id = 899,
                    CourseName = "C#高级开发",
                    TeacherId = 22
                };
                helper.Insert(info);

以上是关于反射实例的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

Java中反射代码实例

创建片段而不从 java 代码实例化它

反射实例测试代码

20170320_系统管理_用户管理1_反射得到model实例

反射的使用