2016-05-08 3 views
1

Мне нужно скомпилировать лямбда-выражение, передающее время, сгенерированное объектом. Вот код, который у меня есть.Есть ли способ скомпилировать лямбда-выражение, передающее время, сгенерированное объектом?

Пример:

var anonType = new { Name = "Florida" }.GetType(); 
var myObj = Activator.CreateInstance(anonType, "Florida"); 

var expression = Expression.Parameter(myObj.GetType(), "Name"); 
var property = Expression.Property(expression, "Name"); 

var rule = new Rule("Name", "NotEqual", "Florida"); 

ExpressionType tBinary; 

if (!Enum.TryParse(rule.Operator, out tBinary)) return; 
var propertyType = myObj.GetType().GetProperty(rule.MemberName).PropertyType; 
var right = Expression.Constant(Convert.ChangeType(rule.TargetValue, propertyType)); 
var result = Expression.MakeBinary(tBinary, property, right); 

var expr = Expression.Lambda<Func<Type, bool>>(result, expression).Compile(); 
var isValid = expr(anonType); 

Я получаю сообщение об ошибке в строке при ее попытке компиляции лямбда-выражения.

Additional information: ParameterExpression of type '<>f__AnonymousType0`1[System.String]' cannot be used for delegate parameter of type 'System.Type' 
+0

Является ли ваш пример реальным прецедентом? Если нет, лучше обеспечьте это, потому что от этого зависит решение. –

ответ

2

Не знаете, чего вы хотите достичь, но ответим на ваш прямой вопрос. Вы можете скомпилировать лямбда в вашем случае:

// create Func<AnonymousType, bool> 
var func = typeof(Func<,>).MakeGenericType(anonType,typeof(bool));    
// compile 
var expr = Expression.Lambda(func, result, expression).Compile(); 
// invoke 
var isValid = expr.DynamicInvoke(new { Name = "NotFlorida" }); 
+0

Спасибо @Evk. Ваш ответ помог мне устранить ошибку, которую я получал. – German

Смежные вопросы