如何为枚举类型的List创建InstanceDescriptor
本文关键字:List 创建 InstanceDescriptor 类型 枚举 | 更新日期: 2023-09-27 18:07:53
类似的问题:将int list作为参数传递给web用户控件
枚举类型有类似的例子吗?
我正在创建一个asp.net自定义控件,其中我想通过逗号分隔的枚举列表作为属性。
我正在编写一个TypeConverter
,用于将逗号分隔的字符串值转换为Enum列表。
在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
我想知道为什么
"长度不匹配"错误发生是因为您检索默认的List<T>
构造函数,它具有 0 参数,然后您要求InstanceDescriptor
用两个参数,MyEnum.Hello
和MyEnum.World
调用该构造函数。
您可能认为可以使用接受单个IEnumerable<T>
参数的备用List<T>
构造函数:
ConstructorInfo constructor =
typeof(List<MyEnum>).GetConstructor(new[] { typeof(IEnumerable<MyEnum>) });
InstanceDescriptor idesc = new InstanceDescriptor(constructor, new[] { list });
这让InstanceDescriptor
很高兴,但不幸的是,您会发现ASP。. NET现在抛出NullReferenceException
而不是(与您链接到的问题相同),因为ASP。. NET不知道如何处理IEnumerable<T>
参数
有两种方法可以解决这个问题。
解决方案1:更改您的自定义控件和类型转换器,以使用MyEnum[]
而不是List<MyEnum>
。这是因为ASP。. NET可以处理数组。
解决方案2:创建一个静态助手方法,从数组创建一个List<MyEnum>
:
public static List<MyEnum> ToList(MyEnum[] values)
{
return new List<MyEnum>(values);
}
然后更改类型转换器以创建一个调用helper方法的InstanceDescriptor
,将列表作为数组传递给它:
MethodInfo method = typeof(MyEnumListConverter).GetMethod("ToList");
InstanceDescriptor idesc = new InstanceDescriptor(method, new[] { list.ToArray() });
您的列表应该是一个空集合,因为constructor
是无参数的constructor
,您的代码应该看起来像这样:
List<MyEnum> list = new List<MyEnum>();
ConstructorInfo constructor = typeof(List<MyEnum>).GetConstructor(Type.EmptyTypes);
InstanceDescriptor idesc = new InstanceDescriptor(constructor, list);
或者使用空的constructor
:
ConstructorInfo constructor =
typeof(List<MyEnum>).GetConstructor(BindingFlags.ExactBinding, null,Type.EmptyTypes, null);
这意味着:GetConstructor
方法中使用的EmptyTypes
字段,以获得不带参数的constructor
。