获取通用对象的枚举器

时间:2014-11-05 16:35:00

标签: c# generics enumerator

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

我想编写一个将对象转换为字典对象的方法。调用此方法时,将提供输入对象的特定类型。

这是我到目前为止所做的。

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

然而,在&#34; TranslateFormData&#34;方法,行

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

产生以下错误:

  

&#39; T&#39;不包含&#39; GetEnumerator&#39;的定义没有扩展方法&#39; GetEnumerator&#39;接受第一个类型&#39; T&#39;可以找到(你错过了使用指令或程序集引用吗?)

如何指定对象表单的类型以获取枚举数?

2 个答案:

答案 0 :(得分:1)

首先,只需创建T类型的参数以避免强制转换:

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

然后,您可以添加generic constraint,以便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.
}

答案 1 :(得分:0)

你问的是什么问题,你基本上是试图强制一个对象来实现IEnumerable接口。 编译器不知道您尝试转换的对象是否肯定是IEnumerable类型。

为此,您必须将通用对象声明为实现指定接口的对象。

只需将此行添加到您的函数声明结尾。

where T : IEnumerable