2014-09-05 54 views
0
public class Program 
{ 
    private static void Main() 
    { 
     ContrivedComparer.Compare<Person>(person => person.Name == "Calvin"); 
    } 
} 

public class Person 
{ 
    public string Name { get; set; } 
} 

public class ContrivedComparer 
{ 
    // this likely looks highly ill-advised out of context but this is contrived. 
    public static readonly object comparatePerson = new Person { Name = "Ted" }; 

    public static void Compare<TComparate>(Expression<Func<TComparate, bool>> predicate) 
    { 
     if (predicate.Compile()((TComparate)comparatePerson)) return; 

     var expression = (BinaryExpression)predicate.Body; 

     var actual = Expression.Lambda(expression.Left).Compile().DynamicInvoke(); 
     var expected = Expression.Lambda(expression.Right).Compile().DynamicInvoke(); 
    } 
} 

我期望actual爲具有相同的值作爲左操作數和用於expected爲具有相同的值作爲右操作數。表達API拋出異常:類型的「X」從範圍「」引用的變量「X」,但它沒有定義

然而,這種代碼拋出具有以下消息的InvalidOperationException:從範圍「」被引用類型「人」的

變量「人」,但它沒有定義。

如何解決此異常?

+0

什麼'實際'和'預計'應該最終成爲? – Jon 2014-09-05 19:13:58

+0

@Jon對不起,如果我不清楚喬恩。我更新了我的問題。 – 2014-09-05 19:17:23

回答

3

您沒有將參數傳遞給第二次創建的lambda,這是您第一次使用這種方式。你需要在構造lambda時指明有一個參數,並在調用它時傳遞值。

public static void Compare<TComparate>(Expression<Func<TComparate, bool>> predicate) 
{ 
    if (predicate.Compile()((TComparate)comparatePerson)) return; 

    var expression = (BinaryExpression)predicate.Body; 

    var actual = Expression.Lambda(expression.Left, predicate.Parameters) 
     .Compile().DynamicInvoke(comparatePerson); 
    var expected = Expression.Lambda(expression.Right, predicate.Parameters) 
     .Compile().DynamicInvoke(comparatePerson); 
} 
相關問題