मैं एक वर्ग बनाने की कोशिश कर रहा हूं जिसमें मूल्य है, जब भी मूल्य बदलता है, तब भी एक ईवेंट बढ़ाएगा, और इसके द्वारा उस प्रकार के रूप में और उसमें से रूपांतरित रूप से परिवर्तित हो जाएगा।एक अवलोकन योग्य <T> कक्षा बनाना: ओवरलोडिंग = ऑपरेटर?
मेरा लक्ष्य यह है कि मुझे कक्षा की एक अवलोकन संपत्ति बनाने में सक्षम होना चाहिए, और एक और वर्ग (डब्ल्यूपीएफ नियंत्रण सहित) को पढ़ने और लिखने में सक्षम होना चाहिए जैसे कि यह एक नियमित स्ट्रिंग था। अन्य वर्ग इसे एक अवलोकन के रूप में संदर्भित कर सकते हैं, या इसे नए कार्यक्रम बनाने के बिना इसे अपनी संपत्ति के रूप में भी बेनकाब कर सकते हैं।
using System;
using System.ComponentModel;
namespace SATS.Utilities
{
public class Observable<T>
{
private T mValue;
public event EventHandler ValueChanged;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyValueChanged()
{
if (ValueChanged != null)
{
ValueChanged(this, new EventArgs());
}
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}
}
public T Value
{
get
{
return mValue;
}
set
{
SetValueSilently(value);
NotifyValueChanged();
}
}
public void SetValueSilently(T value)
{
mValue = value;
}
public static implicit operator T(Observable<T> observable)
{
return observable.Value;
}
public static T operator =(Observable<T> observable, T value) // Doesn't compile!
{
observable.Value = value;
return value;
}
}
}
समस्या यह है कि "=" ऑपरेटर शिकायत कर रहा है कि यह अतिभारित नहीं किया जा सकता है:
यहाँ मैं अब तक है। मुझे लगता है कि यह समझ में आता है, क्योंकि यह अजीब व्यवहार के सभी प्रकार के लिए नेतृत्व कर सकता है। क्या मैं हासिल करने के लिए एक और तरीका है जिसके लिए मैं जा रहा हूं?
संपादित करें: यहां बताया गया है कि मैंने इसे लागू करने का निर्णय लिया है। अगर कोई बेहतर सुझाव हैं तो मुझे बताएं :)
मुझे एहसास हुआ कि इस मामले को वास्तव में उस संपत्ति द्वारा संभाला जाना चाहिए जो पर्यवेक्षी है।
public class A
{
private readonly Observable<string> _property;
public Observable<string> Property
{
get { return _property; }
}
public string Property
{
set { _property.Value = value; }
}
}
बेशक
, कि क्योंकि संपत्ति दो बार परिभाषित किया गया है संकलन नहीं करता है: यहाँ मैं करना चाहते हैं क्या का एक उदाहरण है। यहाँ कुछ हद तक hackish वैकल्पिक हल है कि मैं एक अंतर्निहित रूपांतरण अन्य तरीके से परिभाषित करने की सोच रहा हूँ (के रूप में आप में से कई का सुझाव दिया है) है:
public static implicit operator Observable<T>(T value)
{
var result = new Observable<T>();
result.SetValueSilently(value);
return result;
}
और संपत्ति के सेटर कॉल करने के लिए उपयोग कर रहा है कि:
public Observable<string> Property
{
get { return _property; }
set { _property.Value = value.Value; }
}
मैंने इसके बारे में सोचा, लेकिन यहां समस्या है। मान लें कि मैं निम्नलिखित करता हूं: [अवलोकन योग्य ए = नया अवलोकन योग्य (); अवलोकन बी = ए; ए = "हाय";] अब, ए और बी सिंक से बाहर हैं क्योंकि ए के मान को सेट करने के बजाय, हमने इसे एक नए ऑब्जर्जेबल ऑब्जेक्ट से बदल दिया है। –
hypehuman
असल में, मैंने फैसला किया है कि यह वास्तव में मेरे लिए काम करेगा। मैं समझाने के लिए अपने प्रश्न को संपादित करूंगा कि कैसे। – hypehuman