c#过滤lambda中的动态属性名称

Joh*_*han 1 c# linq asp.net lambda

我在命名不佳的属性方面遇到问题:

public class Word
{
     public string Alt01 { get;set; }
     public string Alt02 { get;set; }
     public string Alt03 { get;set; }
     public string Alt04 { get;set; }
     public string Alt05 { get;set; }
}
Run Code Online (Sandbox Code Playgroud)

这应该是该类型的一个属性List<string>.但其他人想出了这个想法,我现在无法改变结构.

我有一个返回很多Word对象的方法.我想要做的是过滤掉Word一个或多个AltXX属性中具有匹配字符串的每个实例.

这是我到目前为止:

foreach(var word in resultList) //<-- List<Word> 
{
    var alt01 = word.GetType().GetProperty("alt01").GetValue(word, null);
}
Run Code Online (Sandbox Code Playgroud)

如果我稍微扩展它,这将作为我的过滤器.但我的问题是:这是否可以使用lambda表达式解决?

Ser*_*rvy 7

所以我们将从一个简单的帮助器(可能是扩展)方法开始,因为我们有一堆属性而不是列表:

public static IEnumerable<string> getAlts(Word word)
{
    yield return word.Alt01;
    yield return word.Alt02;
    yield return word.Alt03;
    yield return word.Alt04;
    yield return word.Alt05;
}
Run Code Online (Sandbox Code Playgroud)

如果它可以有N个属性而不是五个属性,你可以重构它以使用反射.如果你真的如此,上帝会帮助你.抨击那个把你放在那个位置的开发人员,而不是仅仅List为我使用一次.

有了它,它并不太糟糕:

List<Word> words = new List<Word>();

string searchText = "foo";
var query = words.Where(word => getAlts(word).Any(alt => alt.Contains(searchText)));
Run Code Online (Sandbox Code Playgroud)

我希望该单词Where Any的alt的单词包含搜索文本.它读起来就像它的工作原理.