2015-05-14 2 views
0

У меня есть представление, что я хотел бы дать модель, но модель может быть двух типов. Пример:с использованием дженериков для просмотра модели

public class Super { 
    public string Name = "super"; 
} 
public class Sub1 : Super { 
    public string Name = "sub1"; 
} 
public class sub2 : Super { 
    public string Name = "sub2"; 
} 

Я пытаюсь экспериментировать с обобщениями, и, глядя на некоторые другие вопросы, которые я вижу, я могу сделать следующее, однако, я объявить переменную внутри класса правильно?

public class Generic<T> where T : Super { 
    public T SubClass { get; set; } //is this ok? 
} 

Если это нормально, как бы добавить такой класс, как модель, в представление?

@model Generic<??> 
<div>@Model.SubClass.Name</div> 

это возможно, я на правильном пути, или я просто делаю целую кучу ничего?

+0

Я не думаю, что вам нужно дженерики для этого. Замените 'T' на' Super'. – Matthew

+0

Вы можете это сделать, но я не вижу здесь никаких веских оснований. Может быть, вам нужно добавить еще какой-то конкретный контекст? В стороне, повторное объявление 'Name' скроет член в базовом классе и, возможно, не будет вести себя так, как вы ожидаете. –

ответ

3

Просто ваше использование вида Super в качестве модели:

@model Super 

Вы будете в состоянии передать либо Sub1 или Sub2 в так как они оба наследуют от Super.

1

Виды бритвы не поддерживают общие модели - у вас может быть определенный общий тип, например IEnumerable<int>, но у вас не может быть IEnumerable<T>.

Похоже, вы действительно хотите регулярное наследование виртуальными методами, а не дженериками.

public class Super { 
    public virtual string Name {get {return "super";}} 
} 
public class Sub1 : Super { 
    override public string Name {get {return "sub1";}} 
} 

И просто использовать Super как тип модели

@model Super 
<div>@Model.Name</div> 

Дополнительное примечание: общие классы не имеют наследования отношения друг к другу (Generic<Super> не в какой-либо форме формы, связанной с Generic<Sub1>) - так что вы не может указывать базовый общий класс и иметь разумную работу для производных классов. После модели даже не позволит пройти Generic<Sub1> (вы можете справиться с этим интерфейсом - читать на «дженериков и ковариации»)

@model Generic<Super> @* can't pass instance of Generic<Sub1> *@ 
Смежные вопросы