如何创建对值字段的引用

在C#中是否有一种方法可以创建一个字段,该字段是对另一个值类型的字段的引用?

class myClass { bool b1; public void method1(ref bool b) { b1 = b; } } 

我希望b1引用b的值,就像b引用原始参数的值一样,因此对b1的更改将影响原始参数。

编辑:

我想要实现的是一个myCheckBox类,它自动更新一个字段。 请参阅: 如何在事件处理程序中更改值参数?

嗯…当然有一种非常扭曲的方式:) 也就是说,用reflection! 您无法获取字段的地址,但我们可以使用reflection。

我警告你,reflection比直接访问某个领域要慢。 实际上,访问其他类的私有领域是一个非常糟糕的做法! 但是,当你无法控制其他人编写的代码时,某些时候对某些脏黑客很有用。

这里的例子,但我一直说,这不是一个好的做法,这里只是为了好奇和教育目的!

使用属性或使用修改属性的类来访问字段的另一种方法。

 // Our FieldReference class that internally uses reflection to get or set a field value. public class FieldReference { private object ownerObject; private FieldInfo fieldInfo; public FieldReference(object ownerObject, string fieldName) { this.ownerObject = ownerObject; this.fieldInfo = ownerObject.GetType().GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); } public FieldReference(object ownerObject, FieldInfo fieldInfo) { this.ownerObject = ownerObject; this.fieldInfo = fieldInfo; } public T Value { get { return (T)this.fieldInfo.GetValue(this.ownerObject); } set { this.fieldInfo.SetValue(this.ownerObject, value); } } } // Our dummy class public class MyClass { // Our field we want to expose. private int myField; public MyClass(int value) { this.myField = value; } // Just a function we use to print the content of myField. public override string ToString() { return this.myField.ToString(); } } class Program { public static void Main() { // We create our class. MyClass mc = new MyClass(5); // We print field value, should be 5 :) Console.WriteLine(mc.ToString()); // We create our field reference FieldReference fieldref = new FieldReference(mc, "myField"); // We set the value using field reference. // Note, we accessed a private field :) fieldref.Value = 100; // Now we print the value, should be 100! Console.WriteLine(mc.ToString()); Console.ReadLine(); } } 

当然! 看看Eric对这个问题的回答:

在C#中将ref设置为成员字段

正如其他人所指出的那样,你不能在C#中的字段中存储对变量的引用,或者实际上是任何CLR语言。

当然,您可以轻松捕获对包含变量的类实例的引用

看起来像是使用委托/事件更好地解决的问题。

而不是尝试执行不可能的(强制值类型表现为引用类型),使用事件并在更改此值时触发它。

从来电者订阅此活动,你很高兴。

不知道你想要什么,你可以使用委托,它听起来像代码味道:

 class myClass { Action modify; public void method1(Action modify) { this.modify = modify; } public void ModifyIt() { modify(false); } } bool b1 = true; //b1 is true var m = new myClass(); m.method1(val => { b1 = val; }); m.ModifyIt(); //b1 is false now