У меня есть интерфейс и два класса, которые реализуют интерфейс. Классы имеют общие типы. Я хотел бы клонировать от экземпляра одного класса к другому.C# Generic Copy Constructor
interface IFoo
{
// stuff
}
class Foo<T> : IFoo
{
// foo stuff
// ifoo implementation
}
class Bar<T> : IFoo
{
// bar stuff
// ifoo implementation
}
У меня есть Foo и вам понравится бар. В баре есть экземпляр-копия с параметром 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;
Метод вызова имеет список. Позже я выбираю отдельные элементы из этого списка для использования, и в этот момент мне нужна панель вместо Foo. При выборе из списка экземпляры имеют тип IFoo, так как в них видны только методы расширения для «this IFoo foo». Я не хочу передавать IFoo в Foo, что потребует повторного объявления типа T. Я бы просто хотел, чтобы Foo сказал Bar, что это такое. Это возможно?
Возможно, мне что-то не хватает, но если вы Функция расширения ur принимает IFoo, как она должна «клонировать» ее в панель, если она имеет тип Foo? –
Все, о чем я забочусь, это значения в свойствах IFoo, которые копируются из Foo в Bar. – blu