我已经彻底搜索了一个答案而没有找到答案。
我想编写一个将对象转换为字典对象的方法。调用此方法时,将提供输入对象的特定类型。
这是我到目前为止所做的。
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;可以找到(你错过了使用指令或程序集引用吗?)
如何指定对象表单的类型以获取枚举数?
答案 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