24 Stimmen

Übergabe von int-Array als Parameter im Web-Benutzersteuerelement

Ich habe ein int-Array als Eigenschaft eines Web-Benutzersteuerelements. Ich möchte diese Eigenschaft inline setzen, wenn möglich, mit der folgenden Syntax:

Dies schlägt zur Laufzeit fehl, da es ein tatsächliches int-Array erwartet, aber stattdessen ein String übergeben wird. Ich kann myintarray zu einem String machen und es im Setter parsen, aber ich frage mich, ob es eine elegantere Lösung gibt.

20voto

mathieu Punkte 30503

Implementieren Sie einen Typkonverter, hier ist einer, Warnung: schnelle und schmutzige Methode, nicht für den Produktionsgebrauch, etc :

public class IntArrayConverter : System.ComponentModel.TypeConverter
{
    public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string);
    }
    public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        string val = value as string;
        string[] vals = val.Split(',');
        System.Collections.Generic.List ints = new System.Collections.Generic.List();
        foreach (string s in vals)
            ints.Add(Convert.ToInt32(s));
        return ints.ToArray();
    }
}

und kennzeichnen Sie die Eigenschaft Ihres Steuerelements :

private int[] ints;
[TypeConverter(typeof(IntsConverter))]
public int[] Ints
{
    get { return this.ints; }
    set { this.ints = value; }
}

0 Stimmen

Ich habe unten ein Beispiel hinzugefügt, das kompiliert. Danke!

6voto

ern Punkte 1522

@mathieu, vielen Dank für deinen Code. Ich habe ihn etwas modifiziert, damit er kompiliert:

public class IntArrayConverter : System.ComponentModel.TypeConverter
{
    public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string);
    }
    public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        string val = value as string;
        string[] vals = val.Split(',');
        System.Collections.Generic.List ints = new System.Collections.Generic.List();
        foreach (string s in vals)
            ints.Add(Convert.ToInt32(s));
        return ints.ToArray();
    }
}

1 Stimmen

Ich habe die Originalantwort korrigiert, du kannst diese löschen, wenn du möchtest.

5voto

Billy Jo Punkte 1287

Mir scheint, dass der logische — und flexiblere — Ansatz darin besteht, sich eine Seite aus den asp:-Listensteuerelementen zu nehmen:

    1
    2
    3

1 Stimmen

Danke. Das könnte funktionieren, aber es ist viel zusätzlicher Code zu Beginn. Ich versuche, so minimalistisch wie möglich zu bleiben.

4voto

spleenboy Punkte 41

Toller Ausschnitt @mathieu. Ich musste das für die Umwandlung von longs verwenden, aber anstatt einen LongArrayConverter zu erstellen, habe ich eine Version geschrieben, die Generics verwendet.

public class ArrayConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        string val = value as string;
        if (string.IsNullOrEmpty(val))
            return new T[0];

        string[] vals = val.Split(',');
        List items = new List();
        Type type = typeof(T);
        foreach (string s in vals)
        {
            T item = (T)Convert.ChangeType(s, type);
            items.Add(item);
        }
        return items.ToArray();
    }
}

Diese Version sollte mit jedem Typ funktionieren, der von einem String konvertierbar ist.

[TypeConverter(typeof(ArrayConverter))]
public int[] Ints { get; set; }

[TypeConverter(typeof(ArrayConverter))]
public long[] Longs { get; set; }

[TypeConverter(typeof(ArrayConverter))]
public DateTime[] DateTimes { get; set; }

2voto

Rob Punkte 44368

Hast du schon einmal versucht, dich mit Typkonvertern zu beschäftigen? Diese Seite scheint einen Blick wert zu sein: http://www.codeguru.com/columns/VB/article.php/c6529/

Außerdem scheint Spring.Net einen StringArrayConverter zu haben (http://www.springframework.net/doc-latest/reference/html/objects-misc.html - Abschnitt 6.4), der, wenn du ihn ASP.net zuführen kannst, indem du das Property mit einem TypeConverter-Attribut dekorierst, möglicherweise funktioniert..

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X