类似的问题: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
我想知道为什么
答案 0 :(得分:2)
答案 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