System.Reflection, как получить позицию поля и свойства?

Вопрос: я использую приведенный ниже класс для сериализации файла CSV в

List<MyCsvFileType>

Затем я конвертирую List<MyCsvFileType> с использованием данных

MyConvertTo

(перечислено ниже также). Проблема в том, что MyConvertTo меняет положение столбцов, то есть все свойства идут после всех открытых переменных.

Проблема, которую это вызывает, состоит в том, что впоследствии я использую SqlBulkCopy, чтобы скопировать DataTable в таблицу базы данных. И, к сожалению, SqlBulkCopy использует индексы столбца, а не имя столбца для автоматического преобразования данных в таблицу базы данных.

Это означает, что я получаю хорошие сообщения об ошибках, потому что он пытается вставить буквенно-цифровой AP_FL_CADKey в поле с плавающей запятой (потому что мои таблицы базы данных имеют ту же структуру, что и класс)...

Есть ли какой-нибудь способ, которым я могу получить положение полей и свойств в MyConvertTo? Так что мне не нужно менять таблицы базы данных (лоты) или писать собственную реализацию BulkCopy, потому что я не хочу также вручную устанавливать соответствие между таблицей данных и таблицей базы данных?

Это должно быть возможно, в худшем случае, путем сортировки по полям смещений...

Учебный класс:

[FileHelpers.IgnoreFirst]
[FileHelpers.IgnoreEmptyLines]
public class MyCsvFileType
{
    public string FL_CADKey;
    public string FL_DWG;
    public string FL_ObjID;

    public string FL_Area;

    public double FL_Area_double
    {
        get
        {
            if (string.IsNullOrEmpty(this.FL_Area))
                return 0.0;
            else
                return System.Convert.ToDouble(this.FL_Area);
        }

    } // End Property PP_Area_double


    public string AP_FL_CADKey;


    public System.Guid UID
    {

        get
        {
            return System.Guid.NewGuid();
        }

    } // End Property UID
}

MyConvertTo:

public static DataTable MyConvertTo(dynamic custs)
{
    DataTable dt = MyCreateTable(custs);

    System.Data.DataRow dr = null;
    foreach (dynamic cli in custs)
    {
        Console.WriteLine();

        Type t = cli.GetType();

        dr = dt.NewRow();

        foreach (System.Reflection.FieldInfo fi in t.GetFields())
        {
            dr[fi.Name] = fi.GetValue(cli);
        }

        foreach (System.Reflection.PropertyInfo pi in t.GetProperties())
        {
            dr[pi.Name] = pi.GetValue(cli, null);
        }

        dt.Rows.Add(dr);
    } // Next cli

    return dt;
}



public static DataTable MyCreateTable(dynamic custs)
    {
        DataTable table = new DataTable("Table_1");

        foreach (dynamic cli in custs)
        {
            Console.WriteLine();

            Type t = cli.GetType();

            foreach (System.Reflection.FieldInfo fi in t.GetFields())
            {
                table.Columns.Add(fi.Name, fi.FieldType);
                //Console.WriteLine(fi.Name + ": " + fi.GetValue(cli));
            }

            foreach (System.Reflection.PropertyInfo pi in t.GetProperties())
            {
                table.Columns.Add(pi.Name, pi.PropertyType);
                //Console.WriteLine(pi.Name + ": " + pi.GetValue(cli, null));
            }

            break;
        } // Next cli

        return table;
    }

2 ответа

Не гарантируется, что порядок возвращаемых полей будет одинаковым, хотя обычно этот порядок определяется.

Я предлагаю вам использовать Linq, чтобы упорядоченно возвращать массив, а затем использовать конвертирование.

Можете ли вы не просто установить ColumnMappings в SqlBulkCopy Например, чтобы добавить отображение идентичности на основе имен столбцов?

Если источник данных и таблица назначения имеют одинаковое количество столбцов, а порядковый номер каждого столбца источника в источнике данных соответствует порядковому положению соответствующего столбца назначения, коллекция ColumnMappings не требуется. Однако, если количество столбцов отличается или порядковые позиции не согласованы, необходимо использовать ColumnMappings, чтобы убедиться, что данные копируются в правильные столбцы.

Например, когда вы добавляете каждый столбец, просто позвоните .Add(ColumnName,ColumnName),

Другие вопросы по тегам