我正在尝试创建一些表达式,其中我将使用lambda创建两种方法:选择器和条件。简化后的用法是condition(selector(data))
,但中间类型只在运行时才知道。我有以下代码,只要中间类型是对象,就可以工作,但在运行时我知道真实类型并希望使用它。
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
目前只允许中间类型为object。是否可能在仅在运行时已知类型的情况下创建此内容?我对整个问题开放其他方法,只要性能不差即可。