2013-08-22 2 views
2

У меня есть функция, которая в настоящее время прототипа, как:Полиморфный типа возвращаемых в C#

List<object> get_object_list(byte object_type, object_void_delegate get_one_specific_type_object) 
{} 

В логике получения списка элементов является одинаковым для всех типов у меня есть, но логика для получения одного элемента , отличается от одного типа к другому, я надеялся получить одну функцию для получения списка всех типов (get_object_list()).

, например, для типа Car я бы назвал:

List<Car> cars_list = (List<Car>) get_object_list (CAR , get_one_car); 

Проблема теперь у меня гр ошибку компиляции для недопустимого преобразования: не может конвертировать List<object> в List<Car>

Есть в любом случае, чтобы исправить Это?

Update: Некоторые пояснения. get_object_list() находится в клиентском компоненте и получает его данные от сетевого ресурса (a NetStream). object_type отправляется на сервер, чтобы сообщить ему желаемый тип списка. Сервер ответит Uint32 number_of_items описанием количества доступных элементов. , то get_one_specific_type_object() будет называться number_of_items раз.

ответ

5

Это звучит, как вы, возможно, захотите сделать метод родовое:

List<T> GetObjectList<T>(byte objectType, Func<T> singleObjectGetter) 

Вы бы назвать это как:

List<Car> cars = GetObjectList<Car>(CAR, GetOneCar); 

Действительно, вы вполне можете найти, что тип вывода позволяет вам просто написать:

List<Car> cars = GetObjectList(CAR, GetOneCar); 

Возможно, вы хотите что-то вроде Func<int, T> или подобное - мы не можем сказать. Также неясно, для чего должен быть, пожалуй, первым параметром. Если вам нужно больше деталей, чем это, вы должны предоставить больше контекста.

Как примечание стороны, я бы сильно поощрял вас к принятию соглашений об именовании C#/.NET.

+0

Общий метод звучит как хорошая идея. см. мое обновление для более подробной информации. Тем не менее, я не знаком с универсальными методами. не могли бы вы объяснить на 'Func singleObjectGetter'? это делегат? –

+0

@EdgarJamesluffternstat: Да, 'Func ' - общий делегат, который уже существует в пространстве имен 'System'. –

+0

будет ли он принимать участие в фактическом звонке? –

0

Вы можете подумать об использовании метода IEnumerable.Cast для этой цели.

Простой пример может выглядеть следующим образом:

var objectArray = new object[]{1,2,3,4,5,8}; 
    var intList = objectArray .Cast<int>() 
+0

Не работал для меня. Не знаю, почему, спасибо. –

1

Хотя я предполагаю, что должны быть лучшие способы реализации вашей функции, это должно сделать трюк, чтобы ваш код работал так, как есть.

List<Car> cars_list = get_object_list (CAR , get_one_car) 
     .Cast<Car>() 
     .ToList() 
+0

Ваш 'Select' был бы лучше, чем' Cast 'или' OfType ', если OP * действительно * не хочет иметь нулевые записи для любого значения, которое не является« Car ». –

+0

@ Jon Skeet: согласен, спасибо;) –

Смежные вопросы