0

我正在尝试比较对象的属性是否具有 int 值。请问如何实现?

int id = 123;
// Func<MyClass, bool> f = x => x.A.B.Id == id;
var a = System.Linq.Expressions.MemberExpression.Property(param, "A");
var b = System.Linq.Expressions.MemberExpression.Property(a, "B");                   

body = System.Linq.Expressions.Expression.Equal(
    System.Linq.Expressions.MemberExpression.Property(b, "Id"),
    System.Linq.Expressions.MemberExpression.Constant(id, typeof(int))
);

这会引发无效操作异常。

4

2 回答 2

1

目前尚不清楚您做错了什么,因为您没有显示足够多的代码或足够多的错误。一般的方法很好。这是一个简短但完整的示例:

using System;
using System.Linq.Expressions;

public class House
{
    public Person Owner { get; set; }
}

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

class Test
{
    static void Main()
    {
        int targetLength = 3;
        var param = Expression.Parameter(typeof(House), "p");
        var a = Expression.Property(param, "Owner");
        var b = Expression.Property(a, "Name");
        var length = Expression.Property(b, "Length");

        var target = Expression.Constant(targetLength, typeof(int));

        var body = Expression.Equal(length, target);
        var lambda = Expression.Lambda<Func<House, bool>>(body, param);

        var compiled = lambda.Compile();
        var house = new House { Owner = new Person { Name = "Jon" } };
        Console.WriteLine(compiled(house));
        house.Owner.Name = "Holly";
        Console.WriteLine(compiled(house));
    }
}

我建议您查看我的代码和您的代码之间的区别,以找出问题所在。

于 2013-06-17T14:08:30.777 回答
0

我发现了。属性 ID 不是 Int32,而是 Int16。我的错。对于其他人。离开前检查对象属性类型 3 次 :)

于 2013-06-17T14:06:18.690 回答