我知道这是一个愚蠢的问题,因为答案可能是“哦,当然!”之一。
这就是我所拥有的:
public interface IEvent {
int Id
string Title
}
public class MeetingEvent : IEvent {
int Id
string Title
//Meeting Properties
string Room;
User Organizer;
}
public class BirthdayEvent : IEvent {
int Id
string Title
//Bday Properties
int Candles;
bool Surprise;
}
我正在使用ASP.NET MVC中的自定义模型绑定器,因为我的主要编辑表单继承自IEvent,而我执行RenderPartial以添加其他类型特定的字段
当我到达模型绑定器时,我可以看到该类型的所有键/值,这很好。现在,我想这样做:
IEvent _event;
switch (eventType) { // EventType is an enum
case EventType.Birthday:
_event = new BirthdayEvent();
_event.Candles= GetValue<int>(bindingContext, "Candles");
_event.Surprise= GetValue<bool>(bindingContext, "Surprise");
break;
case EventType.Meeting:
_event = new MeetingEvent();
// Meeting-specific fields are set here...
break;
default:
throw new InvalidOperationException("Invalid Event Type");
}
本质上,我想要一个IEvent变量,我想创建一个特定的事件类型来实现IEvent并设置特定于类型的字段。 Visual Studio告诉我的是它无法访问BirthdayEvent字段。
虽然我理解这一点,但我似乎无法弄清楚我需要做什么。因此,这个问题:)。
提前致谢!
答案 0 :(得分:3)
首次创建BirthdayEvent
和MeetingEvent
的实例时,请将它们放在该类型的变量中。这样你就可以分配这些成员了。然后将它们分配给您的_event
变量。像这样:
switch (eventType) { // EventType is an enum
case EventType.Birthday:
{
var be = new BirthdayEvent();
be.Candles= GetValue<int>(bindingContext, "Candles");
be.Surprise= GetValue<bool>(bindingContext, "Surprise");
_event = be;
break;
}
case EventType.Meeting:
{
var me = new MeetingEvent();
// Meeting-specific fields are set here...
_event = me;
break;
{
default:
throw new InvalidOperationException("Invalid Event Type");
}
答案 1 :(得分:2)
这些方面的东西:
IEvent _event;
switch (eventType) { // EventType is an enum
case EventType.Birthday:
var birthdayEvent = new BirthdayEvent();
birthdayEvent.Candles= GetValue<int>(bindingContext, "Candles");
birthdayEvent.Surprise= GetValue<bool>(bindingContext, "Surprise");
_event = birthdayEvent;
break;
/* etc */
default:
throw new InvalidOperationException("Invalid Event Type");
}