应用泛型方法的错误

时间:2013-09-02 05:15:18

标签: c# generics

参考我的previous question,我调整了我的代码,使用 Generics ,如

FileHelperEngine engine;
public DateTime ExportResultsToCsv<T>(string filePath, string HeaderLine, List<T> data)   
{
    engine = new FileHelperEngine(typeof(T)) { HeaderText = HeaderLine };
    engine.WriteFile(filePath, data);
    return DateTime.Now;   
}

但是,当我尝试将其集成到我的代码中时,我面临以下两个错误:

  

错误1 最佳重载方法匹配   “FileHelpers.FileHelperEngine&LT;对象&gt; .WriteFile(字符串,   System.Collections.Generic.IEnumerable&lt; object&gt;)'有一些无效   参数

     

错误2 参数2:无法转换   'System.Collections.Generic.List&LT; T&GT;'至   'System.Collections.Generic.IEnumerable&LT;对象&gt;'

我无法得到错误的内容。有人可以帮忙吗。

错误行:

engine.WriteFile(filePath, data);

Updates1:

我正在使用 FileHelper.dll 进行Csv文件转换,而 FileHelperEngine 类属于该dll。

Updates2: 正如@sza建议的那样,我更改了以下是我的错误的屏幕截图

enter image description here 提前谢谢。

3 个答案:

答案 0 :(得分:3)

这就是原因。我们来看看source code

        /// <include file='FileHelperEngine.docs.xml' path='doc/WriteFile/*'/>
#if ! GENERICS
        public void WriteFile(string fileName, IEnumerable records)
#else
        public void WriteFile(string fileName, IEnumerable<T> records)
#endif
        {
            WriteFile(fileName, records, -1);
        }

由于您使用通用类型FileHelperEngine(通用方式为FileHelperEngine<T>),您可以看到该方法将第二个参数设为IEnumerable通用IEnumerable<T>,但是对非泛型集合的简单迭代。

因此,我相信您可以执行以下操作以使代码正常工作:

engine.WriteFile(filePath, (IEnumerable)data);

engine.WriteFile(filePath, data as IEnumerable);

engine.WriteFile(filePath, data.Cast<Object>());

希望它有所帮助。

答案 1 :(得分:2)

尝试FileHelperEngine<T>而不是FileHelperEngine

public DateTime ExportResultsToCsv<T>(string filePath, string HeaderLine, List<T> data)  where T : class    
{
    FileHelperEngine<T> engine = new FileHelperEngine<T>() { HeaderText = HeaderLine };
    engine.WriteFile(filePath, data);
    return DateTime.Now;   
}

[FixedLengthRecord]
public class Foo
{

}

并使用:

ExportResultsToCsv<Foo>("", new List<Foo>());

答案 2 :(得分:2)

我在您的问题中修复了通用标记,现在很明显,您尝试使用无效类型调用WriteFile。尝试将对象转换为对象。

engine.WriteFile(filePath, data.Cast<Object>());

问题出现是因为List<T>实现了IEnumerable<T>,而不是IEnumerable<Object>方法所期望的。