【发布时间】:2019-05-28 22:09:19
【问题描述】:
这里的总体目标是这样的:我们在 Azure Blob 存储中存储了大量各种名称和格式的 CSV 文件。我们需要将它们转换为列表。
我有一个界面:
public interface IGpasData
{
List<T> ConvertToList<T>(StreamReader reader);
}
下面是一个实现它的类的例子:
public class GpasTableOfContent : IGpasData
{
public string TocProp0 { get; set; }
public string TocProp1 { get; set; }
public string TocProp2 { get; set; }
public List<T> ConvertToList<T>(StreamReader reader)
{
List<T> dataList = new List<T>();
while (!reader.EndOfStream)
{
var lineItem = reader.ReadLine();
GpasTableOfContent dataItem = new GpasTableOfContent
{
TocProp0 = lineItem.Split(',')[0],
TocProp1 = lineItem.Split(',')[1],
Type = lineItem.Split(',')[2]
};
dataList.Add(dataItem);
}
return dataList;
}
}
为了继续上面的类示例,有一个名为 ToC.csv 的文件。在一个旨在将该文件转换为列表的类中,我进行了以下调用:
List<GpasTableOfContent> gpasToCList = ConvertCloudFileToList<GpasTableOfContent>("ToC.csv", "MyModel");
其他一些可能的例子:
List<GpasFoo> gpasFooList = ConvertCloudFileToList<GpasFoo>("foo.csv", "MyModel");
List<GpasBar> gpasBarList = ConvertCloudFileToList<GpasBar>("bar.csv", "MyModel");
这是 ConvertCloudFileToList:
private List<T> ConvertCloudFileToList<T>(string fileName, string modelName)
{
// Get the .csv file from the InProgress Directory
string filePath = $"{modelName}/{fileName}";
CloudFile cloudFile = _inProgressDir.GetFileReference(filePath);
List<T> dataList = new List<T>();
// Does the file exist?
if (!cloudFile.Exists())
return dataList;
using (StreamReader reader = new StreamReader(cloudFile.OpenRead()))
{
IGpasData gpasData = (IGpasData)Activator.CreateInstance<T>();
dataList = gpasData.ConvertToList<T>(reader);
}
return dataList;
}
这让我们回到ConvertToList。问题出在这里:
dataList.Add(dataItem);
无法将“GpasFoo”转换为“T”
不知道如何解决这个问题。
【问题讨论】:
-
好的;删除了那个;
T这里是GpasTableOfContent的子类吗?还是这无关? -
不相关。嗯...如何在不使用数英里代码填满屏幕的情况下呈现大画面?让我稍微编辑一下 OP。
-
接口被编写为支持任何类型 T,但代码被编写为显式使用
List或GpasTableOfContents。哪一个是正确的? -
接口正确。这是需要帮助的方法。
-
在我看来,您应该将
T类型参数移动到接口:IGpasData<T> { List<T> ConvertToList(StreamReader reader); },然后是GpasTableOfContent : IGpasData<T>,尽管您不能静态确保声明和结果类型匹配。跨度>