获取泛型对象的枚举器

本文关键字:枚举 对象 泛型 获取 | 更新日期: 2023-09-27 18:29:11

我已经彻底搜索了一个答案,但没有找到。

我想写一个方法,把一个对象翻译成字典对象。当调用此方法时,将提供输入对象的特定类型。

以下是我迄今为止所掌握的信息。

public static Dictionary<string, string> TranslateFormData<T>(Object form)
{
    T formData = (T)Convert.ChangeType(form, typeof(T));
    Dictionary<string, string> data = new Dictionary<string, string>();
    IEnumerator<KeyValuePair<string, string>> pairs = formData.GetEnumerator();
    while (pairs.MoveNext())
    {
        //Code left out for brevity
    }
    return data;
}

使用情况类似于这个

Dictionary<string,string> data = FormData.TranslateFormData<FormCollection>(formData);

然而,在"TranslateFormData"方法中,行

IEnumerator<KeyValuePair<string, string>> pairs = formData.GetEnumerator ( );

产生以下错误:

"T"不包含"GetEnumerator"的定义,也找不到接受"T"类型的第一个参数的扩展方法"GetEn枚举器"(是否缺少using指令或程序集引用?)

如何指定对象形式的类型以获得枚举器?

获取泛型对象的枚举器

首先,只需使参数类型为T即可避免强制转换:

public static Dictionary<string, string> TranslateFormData<T> ( T formData )

然后,您可以添加通用约束,以便T必须实现IEnumerable< KeyValuePair< string, string > >:

public static Dictionary<string, string> TranslateFormData<T> ( T formData ) 
    where T : IEnumerable<KeyValuePair<string, string>>
{
    // don't need this line due to above
    //T formData = ( T )Convert.ChangeType ( form, typeof ( T ) );
    // rest the same.
}

您所要求的内容存在问题,您基本上是在试图强制对象实现IEnumerable接口。编译器不知道您试图转换的对象是否定义为IEnumerable类型。

对于,必须将泛型对象声明为实现指定接口的对象。

只需将这一行添加到函数声明的末尾即可。

where T : IEnumerable