如何创建对值字段的引用

时间:2011-10-28 12:58:16

标签: c# reference

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

class myClass
{
    bool b1;

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

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

编辑:

我想要实现的是myCheckBox类,它会自动更新字段。请参阅:How do I change a value argument from within an event handler?

4 个答案:

答案 0 :(得分:3)

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

Setting a ref to a member field in C#

  

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

     

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

答案 1 :(得分:2)

看起来使用委托/事件可以更好地解决问题。

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

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

答案 2 :(得分:2)

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

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

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

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

// Our FieldReference class that internally uses reflection to get or set a field value.
public class FieldReference<T>
{
    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<int> fieldref = new FieldReference<int>(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();
    }
}

答案 3 :(得分:1)

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

class myClass
{
    Action<bool> modify;

    public void method1(Action<bool> 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