Domanda

So che questa è una domanda stupida, nel senso che la risposta è probabilmente un "oh ragione, naturalmente!" uno.

Ecco quello che ho:

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;

}

Sto lavorando su un modello personalizzato legante in ASP.NET MVC come il mio modulo di modifica principale eredita da iEvent mentre eseguo un RenderPartial per aggiungere gli altri campi specifici del tipo

Quando arrivo al modello legante, posso vedere tutte le chiavi / valori per il tipo, che è buono. Ora, io voglio fare questo:

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");
}

In sostanza, voglio una variabile iEvent e voglio creare un tipo di evento specifico che implementa iEvent e impostare i campi specifici del tipo. Quello che Visual Studio mi dice è che non può accedere ai campi BirthdayEvent.

Mentre, ho capito questo, non riesco a capire cosa devo fare. Così, questa domanda:)

.

Grazie in anticipo!

È stato utile?

Soluzione

Quando si crea le istanze di BirthdayEvent e MeetingEvent, metterli nelle variabili di quel tipo. In questo modo è possibile assegnare tali membri. Poi li assegna alla variabile _event. In questo modo:

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");
}

Altri suggerimenti

Qualcosa di lungo queste linee:

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");
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top