2011-10-28 10 views
2

値タイプである別のフィールドへの参照であるフィールドを作成する方法はありますか?値フィールドへの参照を作成する方法

class myClass 
{ 
    bool b1; 

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

私はB1への変更は、元の引数に影響するようにb1は、bは、元の引数の値を参照するのと同様に、bの値を参照したいです。

EDIT:

私が達成しようとしている何が自動的にフィールドを更新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

まあ...もちろん非常にcontort方法があります:)もちろん。 つまり、反射を使用して! フィールドのアドレスは取得できませんが、リフレクションを使用できます。

フィールドに直接アクセスするよりも反射が遅いです、私はあなたに警告します。 本当に、他のクラスのプライベートフィールドにアクセスすることは本当に悪い習慣です! ただし、他人が書いたコードを管理していないときには、汚れたハックのために便利です。

ここでは例を挙げていますが、それは好例ではなく、好奇心と教育目的のためだけにここにあります!

フィールドにアクセスするには、プロパティを使用するか、プロパティを変更するクラスを使用する別の方法があります。

// 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

デリゲート/イベントを使用してよりよく解決されるように見えます。

不可能な(強制値タイプを参照型として動作させる)のではなく、イベントを使用して、この値が変更されたときにいつでも発生させます。

発信者からこのイベントを購読してください。あなたは行き​​たいです。

3

確かに!この質問へのエリックの答えを見てみましょう:他の人が指摘したように

Setting a ref to a member field in C#

、あなたは、実際には任意のCLR言語をC#でフィールドに変数 への参照を保存したり、することはできません。あなたは は簡単に十分な変数が含まれていることを、クラスのインスタンスへの参照をキャプチャすることができますもちろん

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 
関連する問題