如何为枚举类型的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创建InstanceDescriptor

"长度不匹配"错误发生是因为您检索默认的List<T>构造函数,它具有 0 参数,然后您要求InstanceDescriptor两个参数,MyEnum.HelloMyEnum.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