Передача неизвестного параметра типа данных в C# - PullRequest
1 голос
/ 26 мая 2020

Моя основная программа читает электронную таблицу через другой класс, который ничего не знает о схеме (т. Е. О типах данных внутри) электронной таблицы. Мой подход состоит в том, чтобы определить файл spreadsheetRecord, который определяет эти типы данных, и передать эту запись как класс или структуру в класс, вызываемый для чтения этой электронной таблицы. 't неявно конвертировать основной тип данных SpreadsheetRecord в тип данных, известный вызываемому классу. Конечно, это невозможно, потому что целевой класс ничего не знает об этом типе данных. Так как же передать схему электронной таблицы подпрограмме класса, отвечающей за чтение и сохранение данных электронной таблицы?

void class Main
{
    public class SpreadsheetRecord
    {
        public double volAvg;
        public double volOvr10;
        public double sumScore;
    }

    static string[] sheetHeads = { "Volume (10 Day Avg)", "Volume (Today/Avg 10 Day)",
            "Equity Summary Score from StarMine from Refinitiv" };

    SpreadsheetData sheetDat = new SpreadsheetData(new SpreadsheetRecord(), sheetHeads);
    ...
}


public class SpreadsheetData //SpreadsheetData parses an "unknown" spreadsheet.xls file
{
    public Dictionary<string, Record> SheetDB { get; private set; } //declaration of database
    public class Record { };  //schema for incoming spreadsheet data record

    public SpreadsheetData(Record schemaRecord, string[] recordHeadings) //constructor read in spreadsheet
    {
        ...
        using (IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(sheetInputFile.OpenRead()))
        {...
            FieldInfo[] recordFieldInfo = typeof(Record).GetFields();
            for (int i = 1; i < result.Tables[0].Rows.Count; i++)
            {
                for (int j = 0; j < recordHeadings.Length; j++)
                    recordFieldInfo[j].SetValue(schemaRecord, sheet1.Rows[i][Column2RecordCrossIndx[j]]);
                SheetDB.Add(sheet1.Rows[i][indxOfSymbol].ToString(), schemaRecord); //store sheet data record
            }
            ...
        }
    }
}

1 Ответ

0 голосов
/ 27 мая 2020

Что ж, использование универсального класса c, похоже, позволяет получить неизвестный тип данных (то есть запись базы данных) в класс чтения электронной таблицы. Огромное спасибо. Любые другие предложения приветствуются.

void class Main
{
    public class SpreadsheetRecord
    {
        public double volAvg;
        public double volOvr10;
        public double sumScore;
    }

    static string[] sheetHeads = { "Volume (10 Day Avg)", "Volume (Today/Avg 10 Day)",
            "Equity Summary Score from StarMine from Refinitiv" };

    SpreadsheetData<SpreadsheetRecord> sheetDat = new SpreadsheetData<SpreadsheetRecord>(sheetHeads);
    ...
}


public class SpreadsheetData<T> where T : new() //SpreadsheetData parses an "unknown" spreadsheet.xls file
{
    public Dictionary<string,T> SheetDB { get; private set; } //allow read access to database

    public SpreadsheetData<T>(string[] recordHeadings) //constructor to read in spreadsheet
    {
        ...
        using (IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(sheetInputFile.OpenRead()))
        {...
            SheetDB = new Dictionary<string,T>(sheet1.Rows.Count); //create database instance
            T schemaRecord = new T(); //create database record instance

            FieldInfo[] recordFieldInfo = typeof(T).GetFields();
            for (int i = 1; i < result.Tables[0].Rows.Count; i++)
            {
                for (int j = 0; j < recordHeadings.Length; j++)
                    recordFieldInfo[j].SetValue(schemaRecord, sheet1.Rows[i][Column2RecordCrossIndx[j]]);
                SheetDB.Add(sheet1.Rows[i][indxOfSymbol].ToString(), schemaRecord); //store sheet data record
            }
            ...
        }
    }
}
...