Tengo una interfaz y dos clases que implementan la interfaz. Las clases tienen tipos genéricos. Me gustaría clonar de una instancia de una clase a la otra.C# Generic Copy Constructor
interface IFoo
{
// stuff
}
class Foo<T> : IFoo
{
// foo stuff
// ifoo implementation
}
class Bar<T> : IFoo
{
// bar stuff
// ifoo implementation
}
Tengo un Foo y me gustaría un bar. Bar tiene un constructor de copia que toma un parámetro de IFoo. creé un método de extensión para implementar el clon:
public static Bar<T> Clone<T>(this IFoo foo)
{
return new Bar<T>(foo);
}
Al llamar al método requiere el tipo:
someFoo.Clone<T> ...
¿Hay una manera de omitir declarar el tipo al llamar al método modificando el método de extensión , o de cualquier otra manera, para permitir que la instancia sea pasada sin preocuparse por su tipo subyacente?
Actualización Así es como se está utilizando esto para ilustrar mejor la situación.
En un método iterar una colección y devolver una enumeración de IFoo. En el método, miro un atributo de la colección fuente y determino el tipo de 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;
El método de llamada tiene una lista. Más tarde, selecciono elementos individuales de esta lista para su uso, en ese punto me gustaría un Bar en lugar de un Foo. Al seleccionar de la lista, las instancias son del tipo IFoo, ya que solo ven los métodos de extensión para "this IFoo foo". No quiero lanzar el IFoo a un Foo, eso requeriría volver a declarar el tipo de T. Me gustaría que Foo le dijera a Bar qué es. es posible?
Quizás me esté faltando algo, pero si Tu función de extensión toma un IFoo, ¿cómo se supone que debe "Clonarlo" en una barra si es de tipo Foo? –
Lo único que me importa son los valores en las propiedades IFoo que se copian de un Foo a una barra. – blu