Wir haben eine generische Erweiterungsmethode, die nur für Objekte funktioniert, die sowohl die INotifyCollectionChanged- als auch die IEnumerable-Schnittstelle unterstützen. Es ist wie folgt geschrieben:Wie können Sie eine Variable vom Typ 'Objekt' explizit in eine generische Mehrfacheinschränkung umwandeln?
public static class SomeExtensions
{
public static void DoSomething<T>(this T item)
where T : INotifyCollectionChanged, IEnumerable
{
// Do something
}
}
Die folgende Fein kompiliert seit ObservableCollection<string>
beide Schnittstellen implementiert und dank der ‚var‘ Schlüsselwort wird Knowntype stark typisiert:
var knownType = new ObservableCollection<string>();
knownType.DoSomething();
aber wir versuchen, diese zu nennen von einem ValueConverter. Das Problem ist, dass der eingehende Wert vom Typ object
ist und obwohl wir testen können, dass das übergebene Objekt beide Schnittstellen implementiert, können wir nicht herausfinden, wie wir es explizit umwandeln, so dass wir diese generische Erweiterungsmethode aufrufen können. Das funktioniert nicht (natürlich) ...
object unknownType = new ObservableCollection<string>();
((INotifyCollectionChanged,IEnumerable)unknownType).DoSomething();
Wie können Sie ein Objekt mehrere Schnittstellen werfen, so dass Sie die generische anrufen können? Nicht einmal sicher, dass es möglich ist.
, dass eine fantastische Frage ist. Sie können natürlich 'dynamisch' verwenden, aber ich bezweifle, dass Sie danach suchen. – usr
Sie könnten Reflexion verwenden. – mageos
Um Dynamik zu vermeiden, werden nur die Typen verwendet, die beide Schnittstellen erfüllen. Sie könnten eine Klasse oder Schnittstelle verwenden, die beide Schnittstellen implementiert. Wie Sie jedoch festgestellt haben, gibt es in C# keine Möglichkeit, den Typ einer Variablen darzustellen, die zwei nicht verwandte Schnittstellen erfüllt. – recursive