C# - IDataReader для Возражения отображению с помощью дженериков

Вы хотите сегментировать свой код. Часть его должна быть 16-разрядным CRC остальной части кода.

, Если все Вы хотите, число проверки, тогда просто используют порядковый номер (предполагающий, что у Вас есть единственная точка поколения). Тем путем Вы знаете, что не получаете дубликаты.

Тогда Вы снабжаете префиксом последовательность CRC-16 того порядкового номера И некоторого закрытого ключа. Можно использовать что-либо для закрытого ключа, пока Вы сохраняете его частным. Сделайте его чем-то большим, по крайней мере, GUID, но это мог быть текст к Война и мир от Gutenberg проекта. Просто потребности быть секретным и постоянным. Наличие закрытого ключа предотвращает людей от способности подделать ключ, но использование CR на 16 битов облегчает повреждаться.

Для проверки Вы просто разделяете число на его две части, и затем берете CRC-16 порядкового номера и закрытого ключа.

, Если Вы хотите затенить последовательную часть больше, затем разделите CRC в двух частях. Поместите 3 цифры в переднюю сторону и 2 позади последовательности (нулевая клавиатура, таким образом, продолжительность CRC последовательна).

Этот метод позволяет Вам запускаться с меньших ключей также. Первые 10 ключей будут 6 цифрами.

10
задан Michael Pakhantsov 2 February 2012 в 16:46
поделиться

8 ответов

Я использую ValueInjecter для этого

Я делаю вот так:

 while (dr.Read())
  {
      var o = new User();
      o.InjectFrom<DataReaderInjection>(dr);
      yield return o;
  }

вам понадобится этот ValueInjection, чтобы это работало:

public class DataReaderInjection : KnownSourceValueInjection<IDataReader>
    {
        protected override void Inject(IDataReader source, object target, PropertyDescriptorCollection targetProps)
        {
            for (var i = 0; i < source.FieldCount; i++)
            {
                var activeTarget = targetProps.GetByName(source.GetName(i), true);
                if (activeTarget == null) continue;

                var value = source.GetValue(i);
                if (value == DBNull.Value) continue;

                activeTarget.SetValue(target, value);
            }
        }
    }
3
ответ дан 3 December 2019 в 23:51
поделиться

Ну, я не знаю, подходит ли он здесь, но вы можете использовать ключевое слово yield

public static IEnumerable<T> MapObject(IDataReader dr, Func<IDataReader, T> convertFunction)
        {
            while (dr.Read())
            {
                yield return convertFunction(dr);
            }
        }
2
ответ дан 3 December 2019 в 23:51
поделиться

Вы можете использовать этот класс LateBinder. Я написал: http://codecube.net/2008/12/new-latebinder/ .

Я написал другое сообщение с использование: http://codecube.net/2008/12/using-the-latebinder/

1
ответ дан 3 December 2019 в 23:51
поделиться

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

Итак, я бы посоветовал вам создать какой-то атрибут столбца, который будет прикреплен к свойствам вашего объекта. А затем просмотрите эти атрибуты свойств и попытайтесь найти данные из этих атрибутов в устройстве чтения данных.

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

Удачи, но если вы хотите сделать что-то подобное, вам, вероятно, понадобится ORM или, по крайней мере, какая-то реализация Active Record.

1
ответ дан 3 December 2019 в 23:51
поделиться

Самый простой способ, который я могу придумать навскидку, - это указать Func делегат для преобразования каждого столбца и построения вашей книги.

В качестве альтернативы, если вы следовали некоторым соглашениям, вы потенциально могли бы справиться с этим с помощью отражения. Например, если каждый столбец сопоставлен со свойством в результирующем объекте с тем же именем, и вы ограничили T в своем Mapper для предоставления конструктивного T, вы можете использовать отражение, чтобы установить значение каждого свойства на значение в соответствующем столбце .

1
ответ дан 3 December 2019 в 23:51
поделиться

как насчет подписки

abstract class DataMapper
{
    abstract public object Map(IDataReader);
}

class BookMapper : DataMapper
{
   override public object Map(IDataReader reader)
   {
       ///some mapping stuff
       return book;
   }
}

public class Mapper<T>
{
    public static List<T> MapObject(IDataReader dr)
    {
        List<T> objects = new List<T>();
        DataMapper myMapper = getMapperFor(T);
        while (dr.Read())
        {
            objects.Add((T)myMapper(dr));
        }

        return objects;
    }

    private DataMapper getMapperFor(T myType)
    {
       //switch case or if or whatever
       ...
       if(T is Book) return bookMapper;

    }
}

Не знаю, синтаксически это правильно, но я надеюсь, вы уловили идею.

1
ответ дан 3 December 2019 в 23:51
поделиться

Я не думаю, что вы сможете обойтись без определения отношений между полями в той или иной форме. Взгляните на эту статью и обратите особое внимание на то, как определяется сопоставление, оно может сработать для вас.

http://www.c-sharpcorner.com/UploadFile/rmcochran/elegant_dal05212006130957PM/elegant_dal.aspx

1
ответ дан 3 December 2019 в 23:51
поделиться

Как насчет использования Fluent Ado.net ?

1
ответ дан 3 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: