繁体   English   中英

根据类型实例化对象

[英]Instantiate object depending on type

我有一个函数读取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?

这是我的第一个问题,如果说得不好,那就很抱歉,建议改进是非常受欢迎的。

Activator.CreateInstance()函数可以获取一系列参数 ,这样您可能不知道运行前需要多少参数 ,但是当您读取CSV时,您创建的数组对应于此特定对象所需的参数数量(幸运的是,你的现场数据对象似乎已经这样做了)。

所以它可能是这样的:

string[] fieldData = csvReader.ReadFields();

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

这是因为Activator.CreateInstance函数使用params关键字

以下内容可能适用于使用泛型和委托

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]); });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM