Ich versuche, die Benachrichtigung über Änderungen an den Eigenschaften eines Objekts über eine IObservable<T>
zu verallgemeinern, aber das ist neben dem Punkt der Frage. Der Punkt der Frage ist: die folgende Zuordnung I meldet eine ungültige Kovarianz Fehler machen:Covariant Zuordnung funktioniert nicht
protected virtual void OnPropertyChanged<T>(
string propertyName,
T oldValue, T newValue)
{
IPropertyChangedNotification<Student, object> notification =
new PropertyChangedNotification<Student, T>(this,
propertyName, oldValue, newValue);
...
}
Dies berichtet:
Cannot implicitly convert type
PropertyChangedNotification<UsingSubjectToWatchProperty.Student, T>
toIPropertyChangedNotification<UsingSubjectToWatchProperty.Student, object>
. An explicit conversion exists (are you missing a cast?)
Dies ist die komplette Code:
class Student
{
private ISubject<IPropertyChangedNotification<Student, object>> _subject =
new Subject<IPropertyChangedNotification<Student, object>>();;
private string _name = null;
public string Name
{
get
{
return _name;
}
set
{
var oldValue = _name;
_name = value;
OnPropertyChanged<string>("Name", oldValue, _name);
}
}
protected virtual void OnPropertyChanged<T>(string propertyName, T oldValue, T newValue)
{
IPropertyChangedNotification<Student, object> notification =
new PropertyChangedNotification<Student, T>(this,
propertyName, oldValue, newValue);
_subject.OnNext(notification);
}
}
public class PropertyChangedNotification<TDeclaringType, TPropertyType>
: IPropertyChangedNotification<TDeclaringType, TPropertyType>
{
public PropertyChangedNotification(TDeclaringType declaringObject,
string propertyName,
TPropertyType oldValue,
TPropertyType newValue)
{
DeclaringObject = declaringObject;
PropertyName = propertyName;
OldValue = oldValue;
NewValue = newValue;
}
public TDeclaringType DeclaringObject { get; set; }
public string PropertyName { get; set; }
public TPropertyType OldValue { get; protected set; }
public TPropertyType NewValue { get; protected set; }
}
public interface IPropertyChangedNotification<TDeclaringType, out TPropertyType>
{
TDeclaringType DeclaringObject { get; set; }
string PropertyName { get; set; }
TPropertyType OldValue { get; }
TPropertyType NewValue { get; }
}
PS : Dies ist kein Produktionscode. Üben Sie einfach Sachen.
''! = ''. Warum brauchst du das erste? Verwenden Sie einfach 'var'. –
Sinatr
Wie angegeben "Objekt"! = 'T'. Als eine Reihe von Seitennoten; Versuchen Sie, die Verwendung von Themen zu vermeiden. Und aus Interesse heraus, INPC-Ereignisse in Observable-Sequenzen zu verwandeln, wurde ein Dutzend Wege gelöst ;-) Hier sind ein paar kostenlose https://github.com/LeeCampbell/RxCookbook/blob/master/Model/PropertyChange.md –
@LeeCampbell: Danke du, Lee. Ich habe deinen Artikel gelesen und es genossen. Ich habe versucht, es auf meine Weise zu tun. Ich versuche, alle Arten von Permutationen und Kombinationen zu machen und alle Beispiele in deinem Buch zu machen und dann noch einige, die ich alleine erfinde. :-) –