У меня есть интерфейс и два класса, которые реализуют интерфейс. У классов есть универсальные типы. Я хотел бы клонировать из экземпляра одного класса в другой.
interface IFoo
{
// stuff
}
class Foo<T> : IFoo
{
// foo stuff
// ifoo implementation
}
class Bar<T> : IFoo
{
// bar stuff
// ifoo implementation
}
У меня есть Foo и я бы хотел бар. Bar имеет конструктор копирования, принимающий параметр IFoo.
Я создал метод расширения для реализации клона:
public static Bar<T> Clone<T>(this IFoo foo)
{
return new Bar<T>(foo);
}
Для вызова метода требуется тип:
someFoo.Clone<T> ...
Есть ли способ пропустить объявление типа при вызове метода путем изменения метода расширения или любым другим способом, чтобы экземпляр мог быть просто передан без заботы о его базовом типе?
Обновление
Вот как это используется, чтобы лучше проиллюстрировать ситуацию.
В методе я повторяю коллекцию и возвращаю перечисление IFoo. В методе я смотрю на атрибут исходной коллекции и определяю тип 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;
У вызывающего метода есть List. Позже я выбираю отдельные элементы из этого списка для использования, и в этот момент я предпочитаю панель вместо Foo. При выборе из списка экземпляры имеют тип IFoo, так как они видят только методы расширения для «this IFoo foo». Я не хочу приводить IFoo к Foo, что потребовало бы повторного объявления типа T. Я просто хотел бы, чтобы Foo сказал Bar, что это такое. Это возможно?