2016-08-01 18 views
0

Ich habe die Klassen Parent Model und ViewModel. Parent Model-Klasse hat GetViewModel() -Methode, und ich versuche, Parent-Klasse zu erben und GetViewModel() in Child-Klasse zu überschreiben. Es wird jedoch eine unendliche Ausnahme ausgelöst.Überschreiben der Klassenmethode "ParentModel" in der Klasse "Child"

Elternteil Ansichtsmodell Klasse:

public class ParentViewModel 
{ 
    public IEnumerable<string> Choices { get; set; } 
    public object Value { get; set; } 
    public IMetaField MetaField { get; set; } 
    public bool IsRequired { get; set; } 
    public bool HasOtherChoice { get; set; } 
    public string ValidationAttributes { get; set; } 
    public string RequiredViolationMessage { get; set; } 
    public string CssClass { get; set; } 
} 

Eltern Model-Klasse:

public class ChildModel : ParentModel 
{ 
    public string CorticonEntityName { get; set; } 
    public string CorticonFieldName { get; set; } 

    public override object GetViewModel(object value, IMetaField metaField) 
    { 
     this.Value = value; 
     return (object)new ChildViewModel() 
     { 
      Choices = this.DeserializeChoices(), 
      Value = value, 
      MetaField = this.MetaField, 
      HasOtherChoice = this.HasOtherChoice, 
      IsRequired = (this.ValidatorDefinition.Required.HasValue && this.ValidatorDefinition.Required.Value), 
      ValidationAttributes = this.BuildValidationAttributesString(), 
      RequiredViolationMessage = this.ValidatorDefinition.RequiredViolationMessage, 
      CssClass = this.CssClass 
     }; 
    } 
} 

ich zwei Kind-Klassen ChildModel Klasse und ChildViewModel classs erstellt haben, die Eltern Lasses erben.

Ich möchte die GetViewModel() der Elternklasse überschreiben, also habe ich getan, wie unten und funktioniert perfekt.

ChildViewModel Klasse:

public class ChildViewModel:ParentViewModel 
{ 
    public string CorticonEntityName { get; set; } 
    public string CorticonFieldName { get; set; } 
} 

ChildModel Klasse:

public class ChildModel : ParentModel 
{ 
    public string CorticonEntityName { get; set; } 
    public string CorticonFieldName { get; set; } 

    public override object GetViewModel(object value, IMetaField metaField) 
    { 
     this.Value = value; 
     return (object)new ChildViewModel() 
     { 
      Choices = this.DeserializeChoices(), 
      Value = value, 
      MetaField = this.MetaField, 
      HasOtherChoice = this.HasOtherChoice, 
      IsRequired = (this.ValidatorDefinition.Required.HasValue && this.ValidatorDefinition.Required.Value), 
      ValidationAttributes = this.BuildValidationAttributesString(), 
      RequiredViolationMessage = this.ValidatorDefinition.RequiredViolationMessage, 
      CssClass = this.CssClass, 
      CorticonEntityName=this.CorticonEntityName, 
      CorticonFieldName=this.CorticonFieldName 
     }; 
    } 
} 

Aber ich nicht‘wollen setzen alle Eigenschaften in der Kinderklasse GetViewModel() erneut als Mutter GetViewModel() macht. Ich wollte die Eltern-Klasse-Methode wieder verwenden und neue Eigenschaften in der Child-Klasse festlegen, also habe ich versucht, wie unten, aber es wird Endlosschleife geworfen.

ChildViewModel Klasse:

public class ChildViewModel:ParentViewModel 
{ 
    public string CorticonEntityName { get; set; } 
    public string CorticonFieldName { get; set; } 
    CheckboxesFieldViewModel baseObject { get; set; } 
} 

ChildModel Klasse:

public class ChildModel : ParentModel 
{ 
    public string CorticonEntityName { get; set; } 
    public string CorticonFieldName { get; set; } 
    CheckboxesFieldViewModel baseObject { get; set; } 

    public override object GetViewModel(object value, IMetaField metaField) 
    { 
     object objBase=this.GetViewModel(value,metaField); 
     return (object)new ChildViewModel() 
     { 
      objParent=objBase, 
      CorticonEntityName = this.CorticonEntityName, 
      CorticonFieldName = this.CorticonFieldName 
     }; 
    } 
} 

Wie der übergeordneten Klasse GetViewModel wieder verwenden können() ohne wieder die Eigenschaften einstellen.

Antwort

1

Ihre Schuld daran ist:

object objBase=this.GetViewModel(value,metaField); 

Sie die gleiche Methode rekursiv immer und immer wieder aufrufen, um den Stapel zu sprengen. Wenn Sie die übergeordnete Methode aufrufe wollen, müssen Sie das base Schlüsselwort verwenden:

object objBase = base.GetViewModel(value, metaField); 
+0

KooKzip, Dank funktioniert perfekt, aber ich habe eine kleine Frage. Der Weg, den ich gemacht habe, ist richtig? –

+0

@Balu Nicht wirklich, Sie brechen das MVC-Muster. Das Viewmodel kann auf das Modell verweisen, nicht umgekehrt –

+0

Ich habe die Komposition so verwendet, wie ich sie von der Parent-Klasse geerbt habe. –