2011-10-28 24 views
2

有沒有在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?

+1

閱讀上的指針。這個:http://blogs.msdn.com/b/ericlippert/archive/2011/06/23/ref-returns-and-ref-locals.aspx –

回答

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(); 
    } 
} 
2

看起來像的東西是更好的使用委託/事件的解決。

,而不是試圖做不可能的事(力值類型表現爲引用類型),使用一個事件,並觸發它時,這個值被改變。

訂閱從主叫/ s的這個事件,你是好去。

3

當然!看看Eric的回答這個問題:

Setting a ref to a member field in C#

正如其他人所指出的那樣,你不能給一個變量 參考在現場存放在C#,或者實際上,任何CLR語言。

當然,你可以捕捉到一個類實例的引用 包含可變容易足以

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 
相關問題