如何为枚举列表创建InstanceDescriptor?

时间:2015-08-14 13:48:20

标签: c# asp.net custom-controls typeconverter typedescriptor

类似的问题:Passing int list as a parameter to a web user control
枚举类型是否有类似的例子?

我正在创建一个asp.net自定义控件,我想将逗号分隔的枚举列表作为属性传递 我正在写一个TypeConverter来将逗号分隔的字符串值转换为枚举列表
ConvertTo方法中,
如何为枚举列表创建InstanceDescriptor对象?

我目前的代码如下:

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

这失败并显示消息

Length mismatch

我想知道为什么

2 个答案:

答案 0 :(得分:2)

您的列表应该是一个空集合,因为构造函数是无参数构造函数,您的代码应如下所示: 列表与LT; MyEnum&GT; list = new List&lt; MyEnum&gt;(); ConstructorInfo构造函数= typeof(List&lt; MyEnum&gt;)。GetConstructor(Type.EmptyTypes); InstanceDescriptor idesc = new InstanceDescriptor(constructor,list); 或者使用null构造函数: ConstructorInfo构造函数=   typeof(List&lt; MyEnum&gt;)。GetConstructor(BindingFlags.ExactBinding,null,Type.EmptyTypes,null); 这意味着:在其中一个GetConstructor方法中使用EmptyTypes字段来获取不带参数的构造函数。

答案 1 :(得分:2)

&#34;长度不匹配&#34;发生错误是因为您检索了default List<T> constructor,其中包含 ZERO 参数,然后您要求InstanceDescriptor使用 TWO 参数调用该构造函数,{{ 1}}和MyEnum.Hello

您可能认为可以使用接受单个MyEnum.World参数的alternate List<T> constructor

IEnumerable<T>

这使ConstructorInfo constructor = typeof(List<MyEnum>).GetConstructor(new[] { typeof(IEnumerable<MyEnum>) }); InstanceDescriptor idesc = new InstanceDescriptor(constructor, new[] { list }); 感到高兴,但不幸的是,您现在发现ASP.NET现在抛出InstanceDescriptor(与question you linked to中相同),因为ASP.NET没有&# 39;知道如何处理NullReferenceException参数。

以下是解决问题的两种方法。

解决方案1 ​​:将自定义控件和类型转换器更改为使用IEnumerable<T>而不是MyEnum[]。这是有效的,因为ASP.NET可以处理数组。

解决方案2:创建一个从数组中创建List<MyEnum>的静态帮助器方法:

List<MyEnum>

然后更改类型转换器以创建一个调用帮助器方法的public static List<MyEnum> ToList(MyEnum[] values) { return new List<MyEnum>(values); } ,将列表作为数组传递给它:

InstanceDescriptor