gpt4 book ai didi

c# - 以通用方式测试匿名类型的字段值

转载 作者:行者123 更新时间:2023-11-30 20:39:42 25 4
gpt4 key购买 nike

我有以下对象查询的 linq:

from tb ItemTable
where tb.id =555
select new
{
field1=tb.field1,
field2=tb.field2,
..
..
..
fieldn=tb.fieldn
}

现在,碰巧所有这些字段都是 string 类型,我想判断是否有任何字段不包含子字符串“ab”。但我想知道我是否可以避免编写这样的过滤器:

where (tb.field1.Contains("ab") == false) && (tb.field2.Contains("ab") == false) ...

所以我的问题是,有什么方法可以在不使用上述方法的情况下完成吗?

一切顺利

最佳答案

由于您无法迭代未知类型的字段,这将需要您使用Reflection 来迭代这些字段:

(from tb ItemTable
where tb.id =555
select new
{
field1=tb.field1,
field2=tb.field2,
..
..
..
fieldn=tb.fieldn
})
.Where(item => !item.GetType().GetProperties()
.Where(propertyInfo => propertyInfo.PropertyType == typeof(string))
.Any(propertyInfo => ((string)propertyInfo.GetValue(item))
.Contains("ab"));

请注意,反射非常慢,因此当您在应用程序中多次重复执行此类操作时,您应该更喜欢通过代码生成 进行过滤.

由于反射的性能,并且由于所有未知类型都是相同的,我们可以一次获取属性,而不是每次迭代都获取它们:

var tableResults = (from tb ItemTable
where tb.id =555
select new
{
field1=tb.field1,
field2=tb.field2,
..
..
..
fieldn=tb.fieldn
})

IEnumerable<PropertyInfo> propertyInfos =
tableResults.FirstOrDefault()?.GetType().GetProperties()
.Where(propertyInfo => propertyInfo.PropertyType == typeof(string));

tableResults = tableResults
.Where(item => !propertyInfos
.Any(propertyInfo => ((string)propertyInfo.GetValue(item))
.Contains("ab")));

此外,如果可能的话,我会尽量避免使用未知类型,或者考虑将字段存储在 Enumerable 中(如果它适合您的应用程序设计)。

关于c# - 以通用方式测试匿名类型的字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34087998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com