Вызовите настраиваемый конструктор с помощью Dapper? - программирование
Подтвердить что ты не робот

Вызовите настраиваемый конструктор с помощью Dapper?

Я пытаюсь использовать Dapper для взаимодействия с таблицами поставщика ASP.NET SQL Memberhip. Я завернул класс SqlMembershipProvider и добавил дополнительный метод, чтобы получить мне MembershipUsers с учетом определенных критериев, относящихся к некоторым пользовательским таблицам, которые у меня есть.

При запросе данных с помощью Dapper кажется, что Dapper сначала создает экземпляр класса с конструктором без параметров, а затем "отображает" возвращенные столбцы в свойства объекта.

Однако свойство UserName в классе MembershipUser не имеет сеттера. Судя по строке 1417 в Dapper SqlMapper.cs, метод GetSettableProps() получает только настраиваемые свойства.

Я попытался сделать запрос MultiMap, чтобы вызвать конструктор, но проблема с этим - объекты, переданные в запрос, уже пропускают имя пользователя.

Я предполагаю, что могу изменить метод GetSettableProps(), но я не уверен, что это сработает или это повлияет на мой существующий код.

Есть ли в любом случае для вызова пользовательского конструктора класса MemberhipUser?

Или есть разумные изменения, которые я мог бы сделать для Dapper для поддержки моей ситуации?

** ОБНОВЛЕНИЕ **

Ответ Marc на использование метода non-generic/dynamic Query() был правильным, но для потомков это метод, который я имел в виду внутри Dapper:

static List<PropInfo> GetSettableProps(Type t)
{
    return t
          .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
          .Select(p => new PropInfo
          {
              Name = p.Name,
              Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true),
              Type = p.PropertyType
          })
          .Where(info => info.Setter != null)
          .ToList();  
}
4b9b3361

Ответ 1

Я бы использовал не общий API запросов здесь...

 return connection.Query(sql, args).Select(row =>
     new AnyType((string)row.Foo, (int)row.Bar) {
         Other = (float)row.Other }).ToList();

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

Ответ 2

Я использую это, возможно, это помогает кому-то

YourList = connection.Query<YourQueryClass>(Query, arg)
              .Select(f => new ClassWithConstructor(f.foo,f.bar))
              .ToList();