根据类型实例化对象

时间:2019-03-28 15:53:48

标签: c#

我有一个读取CSV文件并返回对象列表的函数,这些对象的参数取决于CSV的内容。现在,如果我对一个对象进行硬编码,它就会起作用。我想返回不同的对象类型。

    public static List<CSVObject> ImportCsvIntoObject(string csvFile, string delimiter)
    {
        List<CSVObject> list = new List<CSVObject>();

        using (TextFieldParser csvReader = new TextFieldParser(csvFile))
        {
            csvReader.SetDelimiters(new String[] { delimiter });
            csvReader.HasFieldsEnclosedInQuotes = true;

            //Parse the file and creates a list of CSVObject
            //example with a csv file with 3 columns
            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                string parameter1 = fieldData[0];
                string parameter2 = fieldData[1];
                string parameter3 = fieldData[2];

                CSVObject example = new CSVObject(parameter1, parameter2, parameter3);
                list.Add(example);
            }
        }
        return list;
    }

以下解决方案有效,但是我不确定是否还有更好的方法。

    public static List<Object> ImportCsvIntoList(string csvFile, string delimiter, Type type)
    {
        List<Object> list = new List<Object>();

        using (TextFieldParser csvReader = new TextFieldParser(csvFile))
        {
            csvReader.SetDelimiters(new String[] { delimiter });
            csvReader.HasFieldsEnclosedInQuotes = true;

            while (!csvReader.EndOfData)
            {

                string[] fieldData = csvReader.ReadFields();
                string parameter1 = fieldData[0];
                string parameter2 = fieldData[1];
                string parameter3 = fieldData[2];

                var example = Activator.CreateInstance(type, parameter1, parameter2, parameter3);
                list.Add(example);
            }
        }
        return list;
    }

此外,现在它仅适用于硬编码的参数。不幸的是,我的对象都有不同数量的参数。如何使用不同数量的参数调用Activator.CreateInstance?

这是我的第一个问题,很抱歉,如果编写不正确,欢迎提出改进建议。

2 个答案:

答案 0 :(得分:0)

Activator.CreateInstance()函数可以使用an array of parameters,因此在运行时之前您可能不知道需要多少,但是在读取CSV时,您将创建与此数组所需的参数数量相对应的数组特定对象(幸运的是,您的字段数据对象似乎已经这样做)。

所以可能是这样的:

string[] fieldData = csvReader.ReadFields();

var example = Activator.CreateInstance(type, fieldData);
list.Add(example);

这是因为Activator.CreateInstance函数使用params keyword

答案 1 :(得分:0)

以下使用泛型和委托可能对您有用

public static List<T> ImportCsvIntoObject<T>(string csvFile, string delimiter, Func<List<string>, T> createObject)
    {
        List<T> list = new List<T>();

        using (TextFieldParser csvReader = new TextFieldParser(csvFile))
        {
            csvReader.SetDelimiters(new String[] { delimiter });
            csvReader.HasFieldsEnclosedInQuotes = true;

            //Parse the file and creates a list of CSVObject
            //example with a csv file with 3 columns
            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();

                CSVObject example = createObject(fieldData.ToList())
                list.Add(example);
            }
        }
        return list;
    }

然后您将使用以下命令调用

List<CSVObject> objectList = ImportCsvIntoObject("csvData", ",", (list) => { new CSVObject(list[0], list[1], list[2]); });