Использование Impromptu-Interface для получения типа свойства

У меня есть комплексное решение, в котором частью проблемы является привязка модели из формы HTML к ряду поддерживаемых базой данных и относительно сложных Entity Framework DbSets.

Дело в том, что у нас есть модель домена EF, которая содержит все, что нам нужно знать о данных, которые мы собираем; но администраторы проекта хотят иметь возможность создавать форму, похожую на анкету, которая позволяет им выбирать любого из членов этого домена.

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

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

Это все хорошо, чтобы получить и установить свойства:

var val = Impromptu.InvokeGet(domain, "fieldName");
Impromptu.InvokeSet(domain, "fieldName", value);

Но что мне нужно сделать, это найти тип имущества. До сих пор я могу только увидеть, как это сделать с помощью Reflection:

PropertyInfo pi = domain.GetType().GetProperty("Name", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (pi.GetValue(domain) is IMyInterface)
{
   // ? profit
}

Итак: возможно ли сделать это с экспромтом? Мне нужно привести это свойство к моему Интерфейсу, так как в нем есть члены, которые преобразуют сообщения формы html в мои объекты EF.

1 ответ

Решение

Основной вопрос, который вы задаете, могу ли я использовать ImpromptuInterface для запроса типов свойств, ответ - нет, у DLR нет функции, есть отражение.

Тем не менее, пример, который вы приводите с использованием отражения, не проверяет тип свойства, он проверяет тип значения времени выполнения, чтобы он по-прежнему работал с Impromptu без отражения.

var val = Impromptu.InvokeGet(domain, "fieldName");
if(val is IMyInterface){
    // ? profit
}

Также, если вы хотите только свойства, посмотрите на FastMember. Он выбирает самый быстрый механизм доступа в зависимости от типа объекта.

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