2017-01-12 3 views
1

У меня есть что-то вроде следующего запросаЩеголеватый строительство завода объект

_connection.Query<SomeType>(SELECT Id, Type, Time FROM table) 

вещь SomeType является универсальным типом

public class SomeType<T> 
{ 
    public int Id { get; set; } 
    public SomeTypeType Type { get; set; } 
    public DateTime Time { get; set; } 
    public T Object { get; set; } 
} 

прямо сейчас я могу определить какой-то SomeType<object> или любой другой, и в для использования правильного общего SomeType<T> Мне нужно восстановить объект.

, что я хочу быть в состоянии сделать это, чтобы иметь линию, например, как это, что будет на самом деле работать

var x = _connection.Query<SomeType<object>>("...") as SomeType<OtherType> 

(Очевидно, что это не является хорошим примером, но в моем случае это имеет гораздо больше смысла)

В любом случае, это, очевидно, возвращает null, и просто не будет работать.

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

Любые предложения, как я могу это сделать?

+0

так что это своего рода вложенный объект, и вы хотите заполнить его по запросу? –

ответ

1

Я не знаю никаких настраиваемых фабрик для типов, используемых в Dapper.

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

Есть TypeHandlers, но они, похоже, больше подходят для отображения типов значений, свойств объекта модели, а не для изменения самого объекта модели.

Так что я думаю, вы должны справиться с этим в более ручным способом:

public class SomeType 
{ 
    public int Id { get; set; } 
    public SomeTypeType Type { get; set; } 
    public DateTime Time { get; set; } 
    public T Object { get; set; } 
} 

public class SomeType<T> : SomeType 
{ 
    public T Object { get; set; } 

    public SomeType() { } 
    public SomeType(SomeType someType, T obj) 
    { 
     this.Id = someType.Id; 
     ... 
     this.Object = obj; 
    } 
} 

var someType = _connection.Query<SomeType>("SELECT Id, Type, Time FROM table"); 
var obj = new Foo(); 
var specialisedSomeType = new SomeType<Foo>(someType, obj); 

Руководство отображение «SomeType» до «SomeType» в конструктор может получить утомительно, так что вы могли бы использовать что-то например AutoMapper для обработки этого бита.

Смежные вопросы