我正在寻找一种使用 lambda 表达式调用通用方法的方法,该表达式在项目数组中调用 Contains。
在本例中,我使用实体框架Where方法,但该场景可以应用于其他IEnumerables。
我需要通过 Reflection 调用上面代码的最后一行,因此我可以使用任何类型和任何属性来传递给 Contains 方法。
var context = new TestEntities();
var items = new[] {100, 200, 400, 777}; //IN list (will be tested through Contains)
var type = typeof(MyType);
context.Set(type).Where(e => items.Contains(e.Id)); //**What is equivalent to this line using Reflection?**
在研究中,我注意到我应该使用 GetMethod、MakeGenericType 和 Expression 来实现这一点,但我不知道如何做到这一点。拥有这个示例将非常有帮助,这样我就可以了解反射如何与 Lambda 和通用概念一起工作。
基本上,目标是编写一个正确版本的函数,如下所示:
//Return all items from a IEnumerable(target) that has at least one matching Property(propertyName)
//with its value contained in a IEnumerable(possibleValues)
static IEnumerable GetFilteredList(IEnumerable target, string propertyName, IEnumerable searchValues)
{
return target.Where(t => searchValues.Contains(t.propertyName));
//Known the following:
//1) This function intentionally can't be compiled
//2) Where function can't be called directly from an untyped IEnumerable
//3) t is not actually recognized as a Type, so I can't access its property
//4) The property "propertyName" in t should be accessed via Linq.Expressions or Reflection
//5) Contains function can't be called directly from an untyped IEnumerable
}
//Testing environment
static void Main()
{
var listOfPerson = new List<Person> { new Person {Id = 3}, new Person {Id = 1}, new Person {Id = 5} };
var searchIds = new int[] { 1, 2, 3, 4 };
//Requirement: The function must not be generic like GetFilteredList<Person> or have the target parameter IEnumerable<Person>
//because the I need to pass different IEnumerable types, not known in compile-time
var searchResult = GetFilteredList(listOfPerson, "Id", searchIds);
foreach (var person in searchResult)
Console.Write(" Found {0}", ((Person) person).Id);
//Should output Found 3 Found 1
}
我不确定其他问题是否解决了这种情况,因为我认为我无法清楚地理解表达式是如何工作的。
Update:
我无法使用泛型,因为我只有在运行时要测试的类型和属性(在 Contains 中)。在第一个代码示例中,假设“MyType”在编译时未知。在第二个代码示例中,类型可以作为参数传递给 GetFilteredList 函数,也可以通过反射 (GetGenericArguments) 获取。
Thanks,