Я пытаюсь сделать некоторые выражения, где я буду использовать лямбду, чтобы создать два метода: селектор и условие. Упрощенное использование - condition(selector(data))
, но тип intemediate известен только во время выполнения. У меня есть следующий код, который работает до тех пор, пока объект intemediate является объектом, но во время выполнения я знаю реальный тип и хотел бы использовать его.Выражение Лямбда с типами, известными во время выполнения
public static ICondition<TData> GetRelayConditionByReflection(string name, string message, string assemblyName,
string fullyQualifiedName, string conditionMethodName, string selectorMethodName) {
var asm = Assembly.LoadFrom(assemblyName);
var type = asm.GetType(fullyQualifiedName);
var selectorMi = type.GetMethod(selectorMethodName, BindingFlags.Static | BindingFlags.Public);
var conditionMi = type.GetMethod(conditionMethodName, BindingFlags.Static | BindingFlags.Public);
var tCondType = selectorMi.ReturnType;
var returnType = typeof(RelayCondition<,>);
var typeArgs = new[] { typeof(TData), tCondType };
var paramTData = Expression.Parameter(typeof(TData), "data");
var selector = Expression.Lambda<Func<TData, object>>(
Expression.Call(selectorMi, paramTData), paramTData).Compile();
var paramTCondition = Expression.Parameter(tCondType, "condition");
var condition = Expression.Lambda<Func<object, bool>>(
Expression.Call(conditionMi, paramTCondition), paramTCondition).Compile();
return (ICondition<TData>)Activator.CreateInstance(returnType.MakeGenericType(typeArgs), name, condition, message, selector);
}
В частности, существует Expression.Lambda<Func<TData, object>>
и Expression.Lambda<Func<object, bool>>
, где object
в настоящее время только позволяет тип intemediate быть объектом.
Возможно ли создать это с типом, известным только во время выполнения? Я открыт для других подходов для всей проблемы, пока производительность не является attrocius.
Почему вам небезразличен промежуточный тип? – Servy
Я не, но если я использую объект, я оба метода должен использовать объект в своем определении, и я хотел бы избежать этого. – hvidgaard