运行时改变私有的只读字段,静态字段值
来源:互联网 发布:mac如何删除桌面文件 编辑:程序博客网 时间:2024/05/19 09:12
如果一个类定义了一个Private的字段,在运行时,正常方式下,在类的外部当然是不能访问这个字段,更谈不上改变值了。但在特殊情况下,我们不能修改已有类的代码,但又要去改变,怎么办?用反射。代码是最好的表达语言:
/* 先定义一个测试类 */
public class TestClass {
private readonly int i1 = 10;
private const int i2 = 20;
private int i3 = 30;
private static int i4 = 40;
private static readonly int i5 = 50;
public void Print() {
Console.WriteLine("i1: " + i1.ToString());
Console.WriteLine("i2: " + i2.ToString());
Console.WriteLine("i3: " + i3.ToString());
Console.WriteLine("i4: " + TestClass.i4.ToString());
Console.WriteLine("i5: " + TestClass.i5.ToString());
Console.WriteLine();
}
}
/* 反射方法修改类的私有字段值 */
class Program {
static void Main(string[] args) {
TestClass tc = new TestClass();
Type type = typeof(TestClass);
tc.Print();
// 只读字段,可通过反射方式修改值
FieldInfo fi = type.GetField("i1", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(tc, (int)fi.GetValue(tc) + 1);
// 常量字段,反射也无法修改,如果取消下面语句的注释,执行会出错。
/* 原因说明:常量的值必须在编译时就确定(只能是基元类型),也就是说在定义时就赋值。
编译后常量的值是保存在程序集的元数据中,在运行时是不可修改的;
而其它字段是存储在动态内存中,在运行时是可修改的。*/
fi = type.GetField("i2", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
//fi.SetValue(null, (int)fi.GetValue(null) + 1);
// 正常字段,当然可以修改
fi = type.GetField("i3", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(tc, (int)fi.GetValue(tc) + 1);
// 静态字段,也可修改
fi = type.GetField("i4", BindingFlags.NonPublic | BindingFlags.Static);
fi.SetValue(null, (int)fi.GetValue(null) + 1);
// 静态只读字段,下面代码不出错,改变了反射字段的值,但类中的字段值并没有被改变
fi = type.GetField("i5", BindingFlags.NonPublic | BindingFlags.Static);
fi.SetValue(null, (int)fi.GetValue(null) + 1);
int i5 = (int)fi.GetValue(null); // i5 得到值为 51
tc.Print();
Console.WriteLine("i5: " + i5.ToString());
Console.ReadKey();
}
}
下面是输出结果:
i1:10
i2:20
i3:30
i4:40
i5:50
i1:11
i2:20
i3:31
i4:41
i5:50
i5:51
- 运行时改变私有的只读字段,静态字段值
- 【C#学习】静态字段、常量字段、只读字段、只读属性的相同点和不同点
- C#实例字段、静态字段、只读字段、常量字段。
- 常量和静态只读字段
- 只读字段的写入
- 只读字段的使用
- 只读字段
- 只读字段
- c#只读字段和常量的区别,以及静态构造函数的使用
- 动态改变DataList绑定的字段值
- 批量改变数据库某字段的值
- Final字段如何改变它们的值
- 静态字段的应用
- C#只读字段和常量的区别
- 常量和只读字段的区别:
- 常量和只读字段的区别:
- 破解C#的readonly只读字段
- mysql 添加字段 删除字段 改变字段的顺序
- Java的常用集合框架
- 深圳单片机开发,电子产品设计,代客生产
- Toad for Oracle 中文乱码问题
- 斐波那契数列非递归计算
- PCB设计,单片机开发,制样代生产
- 运行时改变私有的只读字段,静态字段值
- 自己做的一个炸碉堡的小游戏(SWING)
- 100句经典构建你良好的人际关系
- fdisk查看,创建分区, mkfs创建文件系统
- 标准C调用C++动态链接库
- Linux目录结构及解释
- (岱山鹿栏晴沙)海岛露营大会精彩回顾
- SS7/C7浅谈
- 从3.X版本开始ExtJs将按照使用人头数对商业开发进行收费