获取泛型对象的枚举器
本文关键字:枚举 对象 泛型 获取 | 更新日期: 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