反射获取属性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace FalseVerification
{
    class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(SomeType);

            SomeType st = new SomeType();
            st.Print();

            // 正常字段,当然可以修改
            FieldInfo fi = type.GetField("f1", BindingFlags.NonPublic | BindingFlags.Instance);
            fi.SetValue(st, (Int32)fi.GetValue(st) + 1);

            // 常量字段,反射也无法修改,如果取消下面语句的注释,执行会出错
            /* 原因说明:常量的值必须在编译时就确定(只能是基元类型),也就是说在定义时就赋值。
               编译后常量的值是保存在程序集的元数据中,在运行时是不可修改的;
               而其它字段是存储在动态内存中,在运行时是可修改的。*/
            fi = type.GetField("f2", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
            //fi.SetValue(null, (Int32)fi.GetValue(null) + 1);

            // 只读字段,可通过反射方式修改值
            fi = type.GetField("f3", BindingFlags.NonPublic | BindingFlags.Instance);
            fi.SetValue(st, (Int32)fi.GetValue(st) + 1);

            // 静态字段,也可修改
            fi = type.GetField("f4", BindingFlags.NonPublic | BindingFlags.Static);
            fi.SetValue(null, (Int32)fi.GetValue(null) + 1);

            // 静态只读字段,下面代码不出错,改变了反射字段的值,但类中的字段值并没有被改变
            fi = type.GetField("f5", BindingFlags.NonPublic | BindingFlags.Static);
            fi.SetValue(null, (Int32)fi.GetValue(null) + 1);
            Int32 f5 = (Int32)fi.GetValue(null); // i5 得到值为51

            st.Print();
            Console.WriteLine("f5: " + f5.ToString());
            Console.ReadKey();
        }
    }

    public class SomeType
    {
        private Int32 f1 = 30;// 私有字段
        private const Int32 f2 = 10;// 私有常量字段
        private readonly Int32 f3 = 20;// 私有只读字段
        private static Int32 f4 = 40;// 私有静态字段
        private static readonly Int32 f5 = 50;// 私有静态只读字段

        public void Print()
        {
            Console.WriteLine("f1: " + f1.ToString());
            Console.WriteLine("f2: " + f2.ToString());
            Console.WriteLine("f3: " + f3.ToString());
            Console.WriteLine("f4: " + SomeType.f4.ToString());
            Console.WriteLine("f5: " + SomeType.f5.ToString());

            Console.WriteLine();
        }
    }
}

转自:http://www.cnblogs.com/Thriving-Country/archive/2009/12/20/1628314.html

posted @ 2016-03-23 13:32  kuleft  阅读(209)  评论(0编辑  收藏  举报