gpt4 book ai didi

c# - 在 List 中搜索对象的所有公共(public)变量以获取特定字符串

转载 作者:行者123 更新时间:2023-12-02 04:47:48 25 4
gpt4 key购买 nike

我正在尝试查看是否可以使用 Linq 搜索具有任何给定对象的 .ToString() 方法的所有公共(public)变量。

基本上我想提供两个参数,一个 List<T>搜索和 string并返回 List<T>具有一个或多个包含我的字符串的公共(public)变量的对象。

我可以使用以下方法获取对象的所有公共(public)属性

Type objectType = _data[0].GetType();
var properties = objectType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
var fields = objectType.GetFields(BindingFlags.Public | BindingFlags.Instance)

但我仍然坚持我应该如何使用它来搜索对象列表,而不是遍历所有对象及其所有属性。

最佳答案

这是一个完整的例子:

(注意:我将编辑此答案以考虑 ToString() 覆盖)

编辑:完成

public class Program
{
public class ToStringNotOverrided0 { }
public int Int { get; set; }
public string str;
public ToStringNotOverrided0 toStringNotOverrided;

public static IEnumerable<T> getMatches<T>(List<T> list, string search) {
if (search == null)
throw new ArgumentNullException("search");
return list.Select(x => new
{
X = x,
Props = x.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public),
Fields = x.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public),
})
.Where(x => x.Props.Any(p =>
{
var val = p.GetValue(x.X, null);
return val != null
&& val.GetType().GetMethod("ToString", Type.EmptyTypes).DeclaringType == val.GetType()
&& val.ToString().Contains(search);
})
|| x.Fields.Any(p =>
{
var val = p.GetValue(x.X);
return val != null
&& val.GetType().GetMethod("ToString", Type.EmptyTypes).DeclaringType == val.GetType()
&& val.ToString().Contains(search);
}))
.Select(x => x.X);
}

static void Main(string[] args)
{
List<Program> list = new List<Program>{
new Program { Int = 0, str = "foo bar" , toStringNotOverrided = new ToStringNotOverrided0()},
new Program { Int = 54, str = "foo 0 bar" , toStringNotOverrided = new ToStringNotOverrided0()},
new Program { Int = 12, str = "foo bar" , toStringNotOverrided = new ToStringNotOverrided0()},
new Program { Int = 720, str = "foo bar" , toStringNotOverrided = new ToStringNotOverrided0() }
};
foreach (var item in getMatches(list, "0"))
{
Debug.WriteLine("Int = " + item.Int
+ ", str = " + item.str
+ ", toStringNotOverrided = " + item.toStringNotOverrided);
}
}
}

关于c# - 在 List<T> 中搜索对象的所有公共(public)变量以获取特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19451806/

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