如何在C#中使用带反射的Linq?

如何在C#中使用带反射的Linq?,c#,linq,reflection,C#,Linq,Reflection,使用枚举的反射从id获取名称。我正在使用: foreach(string idValue in Values) { var listSource = itemsSource as IEnumerable; Type listType = listSource.GetType().GenericTypeArguments[0] PropertyInfo idProperty = listType.GetType().GetProperty("Id"); Proper

使用枚举的反射从id获取名称。我正在使用:

foreach(string idValue in Values)
{
    var listSource = itemsSource as IEnumerable;
    Type listType = listSource.GetType().GenericTypeArguments[0]
    PropertyInfo idProperty = listType.GetType().GetProperty("Id");
    PropertyInfo nameProperty = listType.GetType().GetProperty("Name");

    foreach (var listItem in listSource)
    {
        if (idValue.Equals(idProperty.GetValue(listItem, null).ToString()))
        {
            value = nameProperty.GetValue(listItem, null).ToString();
            break;
        }
    }
    //do something with value.
}
如何将Linq与反射一起使用,这样我就不需要在外部循环中循环每个'idValue'值的元素

比如:

reflectionList。选择(x=>x.idProperty==idValue)
并使用它获取
nameProperty的值


请帮助。

这无法测试,因为我真的不知道您使用的是什么类型(特别是
值),也不知道预期结果是什么

value = listSource.Where(item => idValue.Equals(idProperty.GetValue(item, null).ToString()))
    .Select(item => nameProperty.GetValue(item, null).ToString())
    .First();

我们首先获取与您的
if
条件对应的所有项,然后通过
nameProperty
将它们转换为简单字符串,然后仅检索第一个(也应该是唯一的)字符串项。

使用LINQ不会避免循环,这只是意味着你不需要写出来。@Botonomous你会惊讶于有这么多人认为Linq更快,因为通过某种魔法,它不必迭代所有的项。我很困惑-如果你知道属性名,为什么要使用反射?你怎么能在外部引用
listItem
您的代码在没有其他上下文的情况下不会按原样编译,因此很难准确理解您使用反射的原因、您尝试执行的操作以及您遇到的问题。您是否在
列表源
中查找在
中具有
Id
值的项目?感谢您的回复。问题是,即使在使用System.Linq之后,我也无法使用.Where或Linq。这可能是因为IEnumerable类型目前还不知道。显然,您在自己的代码中使用了
IEnumerable
,所以这不是问题所在。你的错误是什么?