2013-10-28 4 views
0

Мне нужно отправить параметр в конструктор нового класса. отправленный параметр i является общим. внутри конструктора я должен использовать его поле (id). но я не могу использовать его напрямую, тогда я хочу использовать его перед использованием. но он сказал, что не может преобразовать тип T в мой конкретный тип.Может ли он преобразовать в определенный тип?

, например

public class Pet<T> 
    { 
     foodType foodType; // enum 
     public Pet(T sample) 
     { 
      if(sample.GetType() == typeof(Dog) 
      { 
       var pet = (Dog)pet; // there is an error. 
       foodType = FoodType.Milk; 
      } 
      if(sample.GetType() == typeof(Cat) 
      { 
       var pet = (Cat)pet; // there is an error. 
       foodType = FoodType.Fish; 
      }  
     } 

    } 

как бросить его? или это не имеет никакого отношения.

У меня есть код примера. Это лучше?

+4

Ваш дизайн ужасно ошибочен. Можете ли вы привести нам пример? Или это так? –

+1

Хорошо, что вы ожидаете от броска? Какова будет фактическая стоимость? Если это не «Собака», как вы ожидаете, что произойдет конверсия? И у вас даже есть * не-общий тип «Собака», чтобы наложить его? Ваш вопрос очень неясен. –

+0

Есть ли класс, который вы назвали «Собака»? Это должно быть «Собака », и это тоже не имеет смысла. –

ответ

3

Вы можете использовать слово «где». Как это:

public class Dog<T> where T: IHasId 

Это означает, что T должен быть унаследован от IHasId межфазных границ

+0

Но все-таки он сможет получить id при использовании этого решения? – Tafari

+0

Да, если он представлен в IHasId interfase – ant

+0

@ant _Type constraint_ будет более правильным термином. Также я думаю, что OP вообще не нуждается в родовом значении. :) – Leri

2

Вы пропускаете пункт дженериков. Вы можете решить эту проблему намного лучше без генериков:

+0

Собирался публиковать почти то же самое. Только одна нота OP может захотеть получить getter для переданного объекта. – Leri

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