我正在寻找一种使用 lambda 表达式调用泛型方法的方法,该 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
}
我不确定其他问题是否解决了这种情况,因为我认为我无法清楚地理解表达式的工作原理。
更新:
我不能使用泛型,因为我只有在运行时要测试的类型和属性(在包含中)。在第一个代码示例中,假设“MyType”在编译时未知。在第二个代码示例中,类型可以作为参数传递给 GetFilteredList 函数,也可以通过反射 (GetGenericArguments) 获取。
谢谢,