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

c#过滤lambda中的动态属性名称,c#,asp.net,linq,lambda,C#,Asp.net,Linq,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; } } 这可能是列表类型的一个属性。但是有人提出了

我遇到了命名不好的属性的问题:

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; }
}
这可能是
列表
类型的一个属性。但是有人提出了这个想法,我现在不能改变结构

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

这就是我到目前为止所做的:

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

foreach(resultList中的var-word)//您能做的最好的事情是在应用程序开始时使用反射一次来构建表达式树,将其编译成lambda,然后保存这些lambda以供重用

反射速度慢的代价是只付出一次,之后它的速度就像你从一开始就编译它一样快


然而,编写这些表达式树是一件很麻烦的事,因此如果你不关心性能(速度很慢,但没有那么慢),那么你的反射应该很好。

你最好在应用程序开始时使用反射一次来构建表达式树,然后编译成lambdas,然后保存这些lambda以便重新使用

反射速度慢的代价是只付出一次,之后它的速度就像你从一开始就编译它一样快


但是,编写这些表达式树是一件很麻烦的事情,因此如果您不关心性能(速度很慢,但没有那么慢),那么您的反射应该很好。

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

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;
}

我希望单词
,其中该单词的alt的任何
都包含搜索文本。它读起来就像工作一样。

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

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;
}

我希望单词
,其中该单词的alt的任何
都包含搜索文本。它读起来就像工作一样。

您可以通过创建帮助器类,以向后兼容的方式将类转换为
列表

例如

静态更容易:

static class WordConverter
{       
    public static List<string> Convert(Word words)
    {
            return new List<string> {words.P1,words.P2, words.P3, words.P4};
    }
}
静态类字转换器
{       
公共静态列表转换(Word)
{
返回新列表{words.P1,words.P2,words.P3,words.P4};
}
}

您可以通过创建帮助器类,以向后兼容的方式将类转换为
列表

例如

静态更容易:

static class WordConverter
{       
    public static List<string> Convert(Word words)
    {
            return new List<string> {words.P1,words.P2, words.P3, words.P4};
    }
}
静态类字转换器
{       
公共静态列表转换(Word)
{
返回新列表{words.P1,words.P2,words.P3,words.P4};
}
}

它是否仅限于Alt05或更高?每个单词的Alt###条目数可能不同?它们是财产吗?你是怎么得到一张这样不同物体的清单的?@Nevyn Alt01到Alt15。正如我前面提到的,我没有想到这个主意。只是想充分利用这种情况。它是否仅限于Alt05或更高?Alt####词条的数量可能因单词而异?它们是财产吗?你是怎么得到一张这样不同物体的清单的?@Nevyn Alt01到Alt15。正如我前面提到的,我没有想到这个主意。为了充分利用这种情况,他可能只是把它作为一种方法添加到类中。比如
IEnumerable GetAlts(){/**code**/}
@Romoku。我想,如果他能够控制类的定义,他可以重构它以使用
列表
,但我认为这样做可能太费事了。如果他能把它放在课堂上,它肯定属于那里。@Servy,你的耳光现在有了一个候选人。OP已确认其高达Alt15.:)@只要它是一个固定的数字,我可能只需要输入15。没那么糟糕,可能比思考更容易处理。根据传入类的运行时类型,如果它是100或N,那么您可能会被迫使用反射。他可能只是将其作为方法添加到类中。比如
IEnumerable GetAlts(){/**code**/}
@Romoku。我想,如果他能够控制类的定义,他可以重构它以使用
列表
,但我认为这样做可能太费事了。如果他能把它放在课堂上,它肯定属于那里。@Servy,你的耳光现在有了一个候选人。OP已确认其高达Alt15.:)@只要它是一个固定的数字,我可能只需要输入15。没那么糟糕,可能比思考更容易处理。根据传入类的运行时类型,如果为100或N,则可能会强制使用反射。谢谢,看起来也很干净简单:)谢谢,看起来也很干净简单:)
static class WordConverter
{       
    public static List<string> Convert(Word words)
    {
            return new List<string> {words.P1,words.P2, words.P3, words.P4};
    }
}