Ho un'interfaccia e due classi che implementano l'interfaccia. Le classi hanno tipi generici. Vorrei clonare da un'istanza di una classe all'altra.C# Generic Copy Constructor
interface IFoo
{
// stuff
}
class Foo<T> : IFoo
{
// foo stuff
// ifoo implementation
}
class Bar<T> : IFoo
{
// bar stuff
// ifoo implementation
}
Ho un Foo e vorrei un Bar. Bar ha un costruttore di copie che prende un parametro di IFoo. ho creato un metodo di estensione per implementare il clone:
public static Bar<T> Clone<T>(this IFoo foo)
{
return new Bar<T>(foo);
}
chiamata al metodo richiede il tipo:
someFoo.Clone<T> ...
Esiste un modo di omettere dichiarare il tipo quando si chiama il metodo modificando il metodo di estensione , o in qualsiasi altro modo, per consentire all'istanza di essere semplicemente inoltrata senza preoccuparsi del suo tipo sottostante?
Aggiornamento Ecco come viene utilizzato per illustrare meglio la situazione.
In un metodo, viene ripetuta una raccolta e viene restituita un'enumerazione di IFoo. Nel metodo guardo un attributo della collezione sorgente e determina il tipo di Foo.
IFoo foo = null;
string type = element.Attribute("Type").Value;
switch (type)
{
case "int":
foo = new Foo<int>();
break;
case "string":
foo = new Foo<string>();
break;
// etc
}
// other stuff
yield return foo;
Il metodo di chiamata ha un elenco. Successivamente seleziono singoli elementi da questo elenco per l'uso, a quel punto vorrei una barra invece di un pippo. Quando si seleziona dalla lista le istanze sono di tipo IFoo, in quanto vedono solo i metodi di estensione per "questo IFoo foo". Non voglio lanciare IFoo to a Foo, che richiederebbe la re-dichiarazione del tipo di T. Vorrei solo che Foo dica a Bar cosa è. È possibile?
Forse mi manca qualcosa, ma se lo si la tua funzione di estensione prende un IFoo, come si fa a "clonarlo" in una barra se è di tipo Foo? –
Tutto ciò a cui tengo sono i valori delle proprietà IFoo copiate da Foo a Bar. – blu