0

EDIT: entfernt ersten Teil der Frage, wie es irreführend und nicht vollständig relevant war.Warum funktioniert eine implizite Konvertierung von int nach intBox nicht in Json.decode oder Standardmodellbindung?

Aus verschiedenen Gründen bin ich an den Punkt gekommen, an dem ich wirklich die Möglichkeit nutzen konnte, einige meiner Post-Body-Parameter in ihrem Modell zu verpacken.

Ich habe damit begonnen, nur das Standardmodell Binder akzeptieren würde funktionieren ™, was es tut, aber nicht für Ints (?!). Beispiel:

public class IntBox 
{ 
    public int Value; 

    public IntBox(int value) 
    { 
     Value = value; 
    } 

    public static implicit operator IntBox(int value) 
    { 
     return new IntBox(value); 
    } 
} 

public class StringBox 
{ 
    public string Value; 

    public StringBox(string value) 
    { 
     Value = value; 
    } 

    public static implicit operator StringBox(string value) 
    { 
     return new StringBox(value); 
    } 
} 

public class BoolBox 
{ 
    public bool Value; 

    public BoolBox(bool value) 
    { 
     Value = value; 
    } 

    public static implicit operator BoolBox(bool value) 
    { 
     return new BoolBox(value); 
    } 
} 

public class NeedQuery : StateFullQuery 
{ 
    public StringBox[] TestStrings { get; set; } //"TestStrings":["a","b"] 
    public IntBox[] TestInts { get; set; } //"TestInts":[1,2,3,4] 
    public BoolBox[] TestBools { get; set; } //"TestBools":[true,false] 
} 

//Inside Controller: 
public string Post([FromBody]NeedQuery query) 
{ 
    //At this point query.TestStrings contains two StringBoxes with the expected values. As does query.TestBools 
    // However, query.TestInts is empty. 
} 

Was vermisse ich ?! Was ist an Ints so besonders, dass sie vom Modelbinder nicht implizit abgegeben werden können? Wie komme ich hier zurecht?

Würde wirklich Hilfe bei diesem zu schätzen wissen; ohne eine große Umschrift bin ich blockiert, bis ich es herausfinden kann.

HINWEIS: Wenn ich sage, dass ich die int-Werte boxen muss, ist das eine Vereinfachung des Problems für den Beitrag, es ist ein bisschen komplizierter als einfach die Werte zu boxen.

Antwort

1

Ich habe es herausgefunden.

funktioniert das nicht:

public class IntBox 
{ 
    public int Value; 

    public IntBox(int value) 
    { 
     Value = value; 
    } 

    public static implicit operator IntBox(int value) 
    { 
     return new IntBox(value); 
    } 
} 

funktionierts:

public class IntBox 
{ 
    public int Value; 

    public IntBox(int value) 
    { 
     Value = value; 
    } 

    public static implicit operator IntBox(Int64 value) 
    { 
     return new IntBox(value); 
    } 
} 

So offensichtlich es einige silliness mit 64/32 Bit-Umwandlung gibt. Ich werde wahrscheinlich meine implizite Konvertierung sowohl für 32- als auch für 64-Bit-Ints implementieren müssen, aber zumindest kann ich aufhören, mir die Haare auszuziehen. Und vielleicht hilft das jemand anderem in der Zukunft.

0

Der Grund dafür ist (kurz gesagt), dass implizite Umwandlungen zur Kompilierungszeit abgeleitet werden, während der Modellbinder zur Laufzeit Reflektionen zur Laufzeit verwendet, wobei es zwei verschiedene - inkompatible - Typen gibt. Die einfachste Lösung, um mit solchen Situationen fertig zu werden, ist in der Regel eine int[] Eigenschaft in Ihrem Modell zu haben, an diese zu binden und sie einfach manuell einer IntBox[] Eigenschaft zuzuordnen (z. B. über benutzerdefinierte Zugriffsmethoden).

Ich werde keine "vollständige" Lösung veröffentlichen, da - wie Sie gesagt haben - Ihr Beispiel vereinfacht ist; Aber hoffentlich sind das genug Informationen, um das Problem zu verstehen und zu lösen.

+0

Wenn dies der Fall war, warum funktioniert die implizite Umwandlung nach String und Bool im zweiten Beispiel, aber nicht die Int? – Glitcher

+0

@Glitcher, das ist eine gute Frage - Ich bin überrascht, dass funktioniert (https://dotnetfiddle.net/cztCKK). Wenn das das Verhalten ist, das Sie sehen, dann muss etwas anderes für diese Eigenschaften geschehen, bevor das Standard-Modellbinder den üblichen Weg zum Einstellen von Eigenschaften erreicht ... –

+0

Ich arbeite im Moment daran, dank Ihrer Antwort, aber ich würde gerne wissen, warum das so schlecht scheitert – Glitcher

Verwandte Themen