Bir değer işleyicisini bir olay işleyicisinden nasıl değiştiririm?

Referans ile başka bir sınıftaki bir yönteme bool veriyorum, böylece onu (orijinal argümanı) metot içinden değiştirebilirim.

Ayrıca, bunu değiştirebilmek için (o yönteme abone olan) bir etkinlik istiyorum.

Bunu yapmak:

class myCheckBox : CheckBox
{
    bool b1;
    public myCheckBox(ref bool b)
    {
        b1 = b;
        this.CheckedChanged += new EventHandler(myCheckBox_CheckedChanged);
    }

    void myCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        b1 = Checked;
    }
}

B1 sadece b'nin bir kopyası olduğu için yardımcı olmaz.

Yapmanın bir yolu var mı: ref b1 = ref b; ? değilse, bunu nasıl çözerim?

(Örnekler sadece soruyu açıklamak içindir.)

1
@dowhilefor Yapmaya çalıştığım, ilişkili boole değiştirecek otomatik bir onay kutusu sınıfı oluşturmaktır.
katma yazar ispiro, kaynak
Belki bunun için boksu kullanabilirsiniz. Ya da dönüş değerini kullanın, neyse ne yapmaya çalıştığını oldukça garip düşünüyorum ve bunu önlemek için çalışmalısınız.
katma yazar dowhilefor, kaynak

4 cevap

Genellikle olay işleyiciniz tarafından değiştirilebilen bir boolean özelliğine sahip olay işleyicinize bir bağımsız değişken iletirsiniz:

public class MyEventArgs : EventArgs
{
    public bool Value { get; set; }
}

public class MyClass
{
    public void method1(ref bool b)
    {
        MyEventArgs e = new MyEventArgs()
        {
            Value = b
        };
        eventMethod(e);

        b = e.Value;
    }

    void eventMethod(MyEventArgs e)
    {
        e.Value = false;
    }
}

You may also want to take a look at the standard event handler pattern established in .NET: How to: Publish Events that Conform to .NET Framework Guidelines (C# Programming Guide)

4
katma
Düzenlenmiş kodu inceleyin.
katma yazar ispiro, kaynak
Yapmaya çalıştığınız şey, OOP kapsülleme ilkesini ihlal ediyor. Bir sınıfın başka bir sınıfın iç durumunu değiştirmesine izin veriyorsun. Aynı olaydaki bir olaya tipik olarak bir olay işleyicisini de bağlamazsınız; Kendi yöntemlerinizi doğrudan arayabilirsiniz. Daha temiz bir yaklaşım, aslında boolean alanını içeren sınıfın CheckedChanged etkinliğine abone olması ve kendisini güncellemesi olacaktır.
katma yazar Joel C, kaynak

Alanı içeren sınıfı, onu ifade eden bir dizgeyi geçirin ve bunları b1 yerine kaydedin. Sonra yansıma kullan.

See How to create a reference to a value-field

1
katma

b1 sınıfınızın genel bir alanını yapın.

Ya da kamu alıcı ve kamu düzenleyici ile bir özelliği ile özel bir.

0
katma

Ben kodu bir Console uygulamasında kopyaladığında (statik işlevlere geçmek zorundaydık ve elbette var b1), Main'dan çağrıldığında istediğiniz gibi çalışır:

bool b = true;
method1(ref b);
Console.writeLine(b1);

'yanlış' yazdırır ....

0
katma
İstediğim Console.writeLine ( b ) için; ‘false’ yazdırmak için
katma yazar ispiro, kaynak