2015-08-14 34 views
6

Podobne pytanie: Passing int list as a parameter to a web user control
Czy istnieje podobny przykład dla typu wyliczeniowego?

Tworzę formant niestandardowy asp.net, w którym chcę przekazać oddzieloną przecinkami listę wyliczeń jako właściwość.
Piszę TypeConverter dla konwertowania wartości ciągu oddzielone przecinkami na listę wyliczeń.

Metoda ConvertTo,
Jak utworzyć obiekt enum?

Mój bieżący kod wygląda następująco:Jak utworzyć InstanceDescriptor dla listy wyliczeń?

//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); 

ta kończy się niepowodzeniem z komunikatem

Length mismatch 

Zastanawiam się, dlaczego

Odpowiedz

2

„Długość niedopasowanie” błąd występuje, ponieważ odzyskać default List<T> constructor, który ma ZERO argumentów, a następnie poprosić InstanceDescriptor wywołać konstruktor z DWA argumentów, MyEnum.Hello i MyEnum.World.

Można by pomyśleć, że można użyć alternate List<T> constructor która akceptuje pojedynczą IEnumerable<T> argument:

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

To sprawia InstanceDescriptor zadowolony, ale niestety, przekonasz się, że ASP.NET teraz rzuca NullReferenceException zamiast (tak samo jak w question you linked to), ponieważ ASP.NET nie wie, jak radzić sobie z parametrami IEnumerable<T>.

Oto dwa sposoby rozwiązania problemu.

Rozwiązanie 1: Zmień swoją kontrolę i swój własny typ konwertera do korzystania MyEnum[] zamiast List<MyEnum>. Działa to, ponieważ ASP.NET może obsługiwać tablice.

Rozwiązanie 2: Tworzenie statycznej metody pomocnika, który tworzy List<MyEnum> z tablicy:

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

następnie zmienić swój przetwornik typu stworzyć InstanceDescriptor który wywołuje metodę pomocniczą, przekazując mu swoją listę jako array:

MethodInfo method = typeof(MyEnumListConverter).GetMethod("ToList"); 
InstanceDescriptor idesc = new InstanceDescriptor(method, new[] { list.ToArray() }); 
2

Twoja lista powinna być pusta kolekcja ponieważ constructor jest bez parametrów constructor Twój kod powinien wyglądać tak:

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

Albo użyć NULL constructor:

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

To znaczy: Pole EmptyTypes używany w jednej z metod GetConstructor dostać constructor które ma żadnych parametrów.

+0

ten zwraca null 'konstruktor' obiektu –

+1

sprawdź moją zaktualizowaną odpowiedź. –