Я создаю DSL в C#, используя деревья выражений, и одна из проблем, которые я пытаюсь решить, - это вывод обобщенных типов c из входного выражения. Вот надуманный пример:
class GenericThing<T> {
public List<IOption<T>> solveMe;
}
// given the type of some expression, (and assuming types are assignable to each other)
var someExpression = new List<IOption<string>>();
// call a function that can infer the type of generic arguments from `GenericThing<>`
Type reflected = SolveGenericTypes(typeof(GenericThing<>), "solveMe", someExpression.GetType()));
// use that type to create an instance of GenericThing<string>
object instance = Activator.CreateInstance(reflected);
Как я могу реализовать SolveGenericTypes()
для «решения» для T? (Бонус, также решить для нескольких обобщенных c аргументов) Мне нужно, чтобы функция работала не только для этого случая, но в основном принимала любое определение универсального c типа и любой конкретный тип (предположим, что нет ошибок проверки типов) и возвращала тип, который может быть создан.
Редактировать: более конкретный пример
DSL принимает XML узлы и преобразует его в деревья выражений, которые генерируют элементы пользовательского интерфейса. Одним из примеров может быть раскрывающийся элемент, который может принять список опций, который набран, но соответствует интерфейсу.
<Dropdown options="someExpressionReturningIOptionsList"/>
class Dropdown<T> {
public List<IOption<T>> options;
}
interface IOption<T> {
string label;
T value;
}
Затем я могу использовать раскрывающийся список с различными типами данных следующим образом:
<Dropdown options="someListOfStringOptions"/>
<Dropdown options="someListOfLocationOptions"/>
<Dropdown options="someListOfIntOptions"/>
<Dropdown options="someListOfFloatOptions"/>
Для каждого из этих четырех использований, которые мне понадобятся выводить тип Dropdown<>
для создания в моем дереве выражений. Я ищу универсальное c (извините, плохое каламбур) решение для 'логического вывода' обобщенных c типов на основе параметра параметров в xml
Спасибо!