2015-08-14 19 views
6

Ähnliche Fragen: Passing int list as a parameter to a web user control
Gibt es ein ähnliches Beispiel für Enum-Typ?

Ich erstelle ein asp.net benutzerdefiniertes Steuerelement, in dem ich kommagetrennte Liste von enums als Eigenschaft übergeben möchte.
Ich schreibe TypeConverter zum Konvertieren von kommagetrennten String-Werten zu List of Enum.

Im ConvertTo Methode
Wie InstanceDescriptor Objekt für die Liste der Aufzählungs zu schaffen?

Mein aktueller Code ist wie folgt:Wie erstellt man InstanceDescriptor für List of enum?

//enum 
public enum MyEnum {Hello, World} 

//main method 
List<MyEnum> list = new List<MyEnum>(); 
list.Add(MyEnum.Hello); 
list.Add(MyEnum.World); 
ConstructorInfo constructor = typeof(List<MyEnum>).GetConstructor(Type.EmptyTypes); 
InstanceDescriptor idesc = new InstanceDescriptor(constructor, list); 

Dies schlägt mit der Nachricht

Length mismatch 

Ich frage mich, warum

Antwort

2

Die „Länge Mismatch“ Fehler tritt auf, weil Sie die default List<T> constructor abrufen, die ZERO Argumente hat, und dann fragen Sie InstanceDescriptor mit diesen Konstruktor aufzurufen ZWEI Argumente, MyEnum.Hello und MyEnum.World.

Man könnte denken, dass Sie die alternate List<T> constructor verwenden könnte, die ein einzelnes IEnumerable<T> Argument akzeptiert:

ConstructorInfo constructor = 
    typeof(List<MyEnum>).GetConstructor(new[] { typeof(IEnumerable<MyEnum>) }); 
InstanceDescriptor idesc = new InstanceDescriptor(constructor, new[] { list }); 

Dies macht InstanceDescriptor glücklich, aber leider werden Sie feststellen, dass ASP.NET wirft jetzt NullReferenceException statt (das gleiche wie in der question you linked to) weil ASP.NET nicht mit IEnumerable<T> Parameter umgehen kann.

Hier sind zwei Möglichkeiten, um das Problem zu lösen.

Lösung 1: Ihre Steuer individuelle Ändern Sie und Ihre Art Konverter MyEnum[] statt List<MyEnum> zu verwenden. Dies funktioniert, weil ASP.NET Arrays verarbeiten kann.

Lösung 2: Erstellen Sie eine statische Hilfsmethode, die eine List<MyEnum> aus einem Array erstellt:

public static List<MyEnum> ToList(MyEnum[] values) 
{ 
    return new List<MyEnum>(values); 
} 

Dann wird Ihr Typ-Konverter ändern eine InstanceDescriptor, die ruft die Hilfsmethode zu erstellen, ist es Ihre Liste als vorbei Array:

2

Ihre Liste sollte eine leere Sammlung sein, weil constructor die parameterlos sind constructor Ihr Code sollte wie folgt aussehen:

List<MyEnum> list = new List<MyEnum>(); 
ConstructorInfo constructor = typeof(List<MyEnum>).GetConstructor(Type.EmptyTypes); 
InstanceDescriptor idesc = new InstanceDescriptor(constructor, list); 

Oder verwenden Sie einen null constructor:

ConstructorInfo constructor = 
    typeof(List<MyEnum>).GetConstructor(BindingFlags.ExactBinding, null,Type.EmptyTypes, null); 

Das heißt: das EmptyTypes Feld in einer der GetConstructor Methoden verwendet, um eine constructor zu erhalten, die keine Parameter annimmt.

+0

dies gibt null 'Konstruktor' Objekt –

+1

überprüfen Sie meine aktualisierte Antwort. –