Вы хотите сегментировать свой код. Часть его должна быть 16-разрядным CRC остальной части кода.
, Если все Вы хотите, число проверки, тогда просто используют порядковый номер (предполагающий, что у Вас есть единственная точка поколения). Тем путем Вы знаете, что не получаете дубликаты.
Тогда Вы снабжаете префиксом последовательность CRC-16 того порядкового номера И некоторого закрытого ключа. Можно использовать что-либо для закрытого ключа, пока Вы сохраняете его частным. Сделайте его чем-то большим, по крайней мере, GUID, но это мог быть текст к Война и мир от Gutenberg проекта. Просто потребности быть секретным и постоянным. Наличие закрытого ключа предотвращает людей от способности подделать ключ, но использование CR на 16 битов облегчает повреждаться.
Для проверки Вы просто разделяете число на его две части, и затем берете CRC-16 порядкового номера и закрытого ключа.
, Если Вы хотите затенить последовательную часть больше, затем разделите CRC в двух частях. Поместите 3 цифры в переднюю сторону и 2 позади последовательности (нулевая клавиатура, таким образом, продолжительность CRC последовательна).
Этот метод позволяет Вам запускаться с меньших ключей также. Первые 10 ключей будут 6 цифрами.
Я использую 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);
}
}
}
Ну, я не знаю, подходит ли он здесь, но вы можете использовать ключевое слово yield
public static IEnumerable<T> MapObject(IDataReader dr, Func<IDataReader, T> convertFunction)
{
while (dr.Read())
{
yield return convertFunction(dr);
}
}
Вы можете использовать этот класс LateBinder. Я написал: http://codecube.net/2008/12/new-latebinder/ .
Я написал другое сообщение с использование: http://codecube.net/2008/12/using-the-latebinder/
Это будет очень сложно сделать по той причине, что вы в основном пытаетесь сопоставить два неизвестных вместе. В вашем универсальном объекте тип неизвестен, а в вашем средстве чтения данных таблица неизвестна.
Итак, я бы посоветовал вам создать какой-то атрибут столбца, который будет прикреплен к свойствам вашего объекта. А затем просмотрите эти атрибуты свойств и попытайтесь найти данные из этих атрибутов в устройстве чтения данных.
Самая большая проблема будет в том, что произойдет, если одно из свойств не будет найдено в считывателе или наоборот. наоборот, один из столбцов в считывателе не найден в сущности.
Удачи, но если вы хотите сделать что-то подобное, вам, вероятно, понадобится ORM или, по крайней мере, какая-то реализация Active Record.
Самый простой способ, который я могу придумать навскидку, - это указать Func
делегат для преобразования каждого столбца и построения вашей книги.
В качестве альтернативы, если вы следовали некоторым соглашениям, вы потенциально могли бы справиться с этим с помощью отражения. Например, если каждый столбец сопоставлен со свойством в результирующем объекте с тем же именем, и вы ограничили T в своем Mapper для предоставления конструктивного T, вы можете использовать отражение, чтобы установить значение каждого свойства на значение в соответствующем столбце .
как насчет подписки
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;
}
}
Не знаю, синтаксически это правильно, но я надеюсь, вы уловили идею.
Я не думаю, что вы сможете обойтись без определения отношений между полями в той или иной форме. Взгляните на эту статью и обратите особое внимание на то, как определяется сопоставление, оно может сработать для вас.
http://www.c-sharpcorner.com/UploadFile/rmcochran/elegant_dal05212006130957PM/elegant_dal.aspx