Laden...

ReadOnlyCollection<T> Constructor (IList<T>) in c-tor als (IEnumerable<T>.ToAray()) ??

Erstellt von Blaster vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.399 Views
B
Blaster Themenstarter:in
66 Beiträge seit 2013
vor 6 Jahren
ReadOnlyCollection<T> Constructor (IList<T>) in c-tor als (IEnumerable<T>.ToAray()) ??

Hallo zusammen!

Ich versuche gerade folgenden Beispielcode von Stack Overflow für Validatoren zu adaptieren:
https://stackoverflow.com/questions/4776396/validation-how-to-inject-a-model-state-wrapper-with-ninject

Was mich mittlerweile in den Wahnsinn treibt, ist folgende Klasse:


public class ValidationException : Exception
{
    public ValidationException(IEnumerable<ValidationResult> r)
        : base(GetFirstErrorMessage(r))
    {
        this.Errors = 
            new ReadOnlyCollection<ValidationResults>(r.ToArray());
    }

    public ReadOnlyCollection<ValidationResults> Errors { get; private set; }

    private static string GetFirstErrorMessage(
        IEnumerable<ValidationResult> errors)
    {
        return errors.First().Message;
    }
}

ReadOnlyCollection<ValidationResults> ist im Namespace System.Collections.ObjectModel und hat aber einen c-tor
ReadOnlyCollection<T> Constructor (IList<T>)

Sollte erst kein Problem, weil Ilist von ziemlich allen Schnittstellen erbt:
public class ReadOnlyCollection<T> : IList<T>, ICollection<T>,
IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>,
IReadOnlyCollection<T>
https://msdn.microsoft.com/en-us/library/ms132474(d=printer,v=vs.110).aspx
theoretisch ...

Nun, der Autor auf SOF will mittels

public ValidationException(IEnumerable<ValidationResult> r)
        : base(GetFirstErrorMessage(r))

ein <Schlüssel, Errormessage> Paar aus IEnumerableT> generieren:

public static void AddModelErrors(this ModelStateDictionary state, 
        ValidationException exception)
    {
        foreach (var error in exception.ValidationErrors)
            state.AddModelError(error.Key, error.Message);
    }

Dafür hat er in

        this.Errors = 
            new ReadOnlyCollection<ValidationResults>(r.ToArray());

das C-tor attribut vom PType IList<T> als Type IEnumable<T>.ToArry() "konvertiert",
was mit VS nach Strich und Faden um die Ohren Klatscht!!> Fehlermeldung:

Fehler CS1503 Argument "1": Konvertierung von "ValidationResult[]" in "System.Collections.Generic.IList<ValidationResults>" nicht möglich.

Da der Code des Autos aus 2011 stammt und 58 Improvals hat und auch recht stark aussieht, wollte ich euch fragen, welcher Film hier läuft:

  1. Wie der Code funktionieren konnte, denn eine andere Version von ReadOnlyCollection<T> habe ich in einer früherer noch aktuellen Version gefunden. 8o
  2. Wie schreibe ich den Code um, so dass ich mit Enumable<T> für die Validatoren arbeiten und oben ein Array - Key, Error - Paar erhalte?

Vielen Dank!

4.942 Beiträge seit 2008
vor 6 Jahren

Dann probiere mal


this.Errors = new ReadOnlyCollection<ValidationResults>(r.ToList());

D
985 Beiträge seit 2014
vor 6 Jahren

Wo ist denn die Klasse ValidationResults definiert?

Ich tippe auf einen schnöden Schreibfehler und es muss überall von ValidationResults nach ValidationResult geändert werden.

😉

@Th69
Ein array implementiert auch IList 😉

B
Blaster Themenstarter:in
66 Beiträge seit 2013
vor 6 Jahren

Jooh! Danke! 😉

Ich habe in meinen alten Code ValidationResults, deshalb war der Fehler nicht aufgefallen.

Booh! Seit Ihr schnell! 👍 👍

Wichtige Randnotiz:
:NET kennt bereits eine
ValidationResult Class
https://msdn.microsoft.com/en-us/library/system.windows.controls.validationresult(v=vs.110).aspx

Ich, wie wahrscheinlich der Autor, haben ValidationResults gebildet, damit wir nicht in Konflikt mit der bestehenden Definition kommen.