如何在一种方法中返回不同的对象列表?我有一些方法可以返回某些类型的列表,而且我不知道 Parse 方法应该返回什么
public static [Something here (IList???)] Parse(string filePath)
{
string[] lines = File.ReadAllLines(filePath);
for (int i = 0; i < lines.Length; i++)
{
string recordId = lines[i].Substring(0, 2);
switch (recordId)
{
case "00":
return Parse00(lines[i]); //public static List<mainInfo> Parse00(string line);
case "11":
return Parse11(lines[i]); //public static List<param> Parse11(string line);
…
…
}
}
}
答案 0 :(得分:1)
为了使其工作,您需要一个所有“记录”继承的基本类型。所以称之为Record
:
public class Record
{
// some shared properties
}
public class ParamRecord : Record
{
// param-specific properties
}
public class MainInfoRecord : Record
{
// main-specific properties
}
现在您可以返回List<Record>
。
答案 1 :(得分:1)
我想告诉你,如果你读到这样的行,你会节省一些内存。
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
您可以在What's the fastest way to read a text file line-by-line?上了解详情。
此外,我会将您的方法重命名为ParseFile以避免混淆,并使用@CodeCaster方法创建类层次结构。一旦你有了类层次结构,就可以编写一个可以为你解析的Factory。
答案 2 :(得分:0)
使用List<dynamic>
作为返回类型。
例如:
public static List<dynamic> Parse(string filePath)
{
string[] lines = File.ReadAllLines(filePath);
for (int i = 0; i < lines.Length; i++)
{
string recordId = lines[i].Substring(0, 2);
switch (recordId)
{
case "00":
return Parse00(lines[i]).ToList<dynamic>; //public static List<mainInfo> Parse00(string line);
case "11":
return Parse11(lines[i]).ToList<dynamic>; //public static List<param> Parse11(string line);
…
…
}
}
}
答案 3 :(得分:0)
您需要mainInfo
和param
- 类继承相同的基类或接口:
interface MyInterface { ... }
class Param : MyInterface { ... }
class MainInfo : MyInterface { ... }
现在您可以返回所需类型的列表:
string recordId = lines[i].Substring(0, 2);
switch (recordId)
{
case "00":
return Parse00(lines[i]); //public static List<mainInfo> Parse00(string line);
case "11":
return Parse11(lines[i]); //public static List<param> Parse11(string line);
但是,您的方法需要返回Enumerable<MainInfo>
或IEnumerable<Param>
,因为List
不是协变,这意味着您无法将List<MainInfo>
分配给List<MyInterface>
,但是,您可以将前者分配给IEnumerable<MyInterface>
,因为IEnumerable
是协变的。
最后,由于两个可能的返回值都可以分配给IEnumerable<MyInterface>
,因此您可以将其用作Parse
方法的返回类型。