我有这个域名:
public class ADomainClass
{
public int Id { get; set; }
}
public interface IMyClass : IEnumerable<ADomainClass>
{
}
public class MyClass : IMyClass
{
public IEnumerator<ADomainClass> GetEnumerator()
{
IList<ADomainClass> list = new List<ADomainClass>();
//list = GetData...();
foreach (var item in list)
{
yield return item;
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
并想要构建以下测试:
[Test]
public void TestSample()
{
//Arrange
IMyClass myclass = Substitute.For<IMyClass>();
IList<ADomainClass> testdata = new List<ADomainClass>()
{
new ADomainClass(){ Id = 1, },
new ADomainClass(){ Id = 2, }, …Run Code Online (Sandbox Code Playgroud) 下面的表达式将属性 NAME 与值 PETER 进行比较。
ParameterExpression pe = Expression.Parameter(typeof(T), "x");
MemberExpression member = Expression.Property(pe, "name");
ConstantExpression value = Expression.Constant("Peter");
exp = Expression.Equal(member, value);
Run Code Online (Sandbox Code Playgroud)
如果该属性是一个类怎么办:
public class Address
{
public string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
那么表达式将类似于以下内容:
MemberExpression member = Expression.Property(pe, "Address.Name");
ConstantExpression value = Expression.Constant("Peter");
exp = Expression.Equal(member, value);
Run Code Online (Sandbox Code Playgroud)
这会失败,因为成员类型与值类型不匹配。
所以,问题是:如何构建一个可以使用上述类示例工作的表达式?
我在 NHibernate.Linq 查询中使用此表达式:
var q = from f in data //of type IQueryable<T>
select f;
if (filter != null) //filter of type Expression<Func<T, bool>>
q = q.Where(filter);
etc....
Run Code Online (Sandbox Code Playgroud)
谢谢。
彼得更新 …