Использование 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. Он выбирает самый быстрый механизм доступа в зависимости от типа объекта.