Abbiamo un metodo di estensione generico che funziona solo per gli oggetti che supporta sia l'INotifyCollectionChanged e le interfacce IEnumerable. E 'scritto in questo modo:Come si può espressamente lanciare una variabile di tipo 'oggetto' per soddisfare un vincolo generico a più caratteri?
public static class SomeExtensions
{
public static void DoSomething<T>(this T item)
where T : INotifyCollectionChanged, IEnumerable
{
// Do something
}
}
Di seguito compila bene dal ObservableCollection<string>
implementa entrambe le interfacce e grazie alla parola chiave 'var', KnownType è fortemente tipizzato:
var knownType = new ObservableCollection<string>();
knownType.DoSomething();
Tuttavia, stiamo cercando di chiamare questo da un ValueConverter. Il problema è che il valore in entrata è di tipo object
e anche se possiamo verificare che l'oggetto passato implementa entrambe le interfacce, non possiamo capire come scriverlo esplicitamente in modo da poter chiamare quel metodo di estensione generica. Questo non funziona (ovviamente) ...
object unknownType = new ObservableCollection<string>();
((INotifyCollectionChanged,IEnumerable)unknownType).DoSomething();
Così come si può lanciare un oggetto a più interfacce in modo da poter chiamare il generico? Non sono nemmeno sicuro che sia possibile.
Questa è una domanda fantastica. Ovviamente puoi usare 'dynamic' ma dubito che sia quello che cerchi. – usr
È possibile utilizzare la riflessione. – mageos
Evitando le dinamiche, gli unici modi per farlo coinvolgeranno i tipi che soddisfano entrambe le interfacce. È possibile utilizzare una classe o un'interfaccia che implementa entrambe le interfacce. Ma, come hai capito, non c'è modo in C# di rappresentare il tipo di una variabile che soddisfa due interfacce indipendenti. – recursive