簡體   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