C# 检查是否有任何对象属性包含字符串

C# 检查是否有任何对象属性包含字符串,c#,C#,我有一个用户信息列表 List<UserInformation> ui = new List<UserInformation>(); 有没有办法检查这些属性是否包含特定的单词?比如说“测试” 更新 我有点想避免类似的事情 !new[] { ".ext", ".test", ".admin" }.Any(c => ui.Title.ToLower().Contains(c)) !new[] { ".ext", ".test", ".admin" }.Any(c =&

我有一个
用户信息列表

List<UserInformation> ui = new List<UserInformation>();
有没有办法检查这些属性是否包含特定的单词?比如说“测试”

更新

我有点想避免类似的事情

!new[] { ".ext", ".test", ".admin" }.Any(c => ui.Title.ToLower().Contains(c))
!new[] { ".ext", ".test", ".admin" }.Any(c => ui.Department.ToLower().Contains(c))
!new[] { ".ext", ".test", ".admin" }.Any(c => ui.Company.ToLower().Contains(c))
!new[] { ".ext", ".test", ".admin" }.Any(c => ui.Username.ToLower().Contains(c))

可以使用此方法使用反射来获取包含文本的所有属性:

public static IEnumerable<PropertyInfo> PropertiesThatContainText<T>(T obj, string text, StringComparison comparison = StringComparison.Ordinal)
{
    var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
       .Where(p => p.PropertyType == typeof(string) && p.CanRead);
    foreach (PropertyInfo prop in properties)
    {
        string propVal = (string)prop.GetValue(obj, null);
        if (String.Equals(text, propVal, comparison)) yield return prop;
    }
}

但总的来说,我会尽可能避免使用反射。而是在
UserInformation
中创建一个显式检查相关属性的方法。或者在你必须知道的地方检查一下。有点冗长但可读,每个人都会理解你的代码,包括你自己。

正如DavidG所指出的,你可以使用运行时反射

但是,如果您对大型数据集(即所有用户)执行此操作,则速度会很慢-在这种情况下,更好的方法是使用T4模板生成代码

或者在数据库(如果信息来自数据库)中执行此操作,或者创建索引并使用lucene之类的“搜索”引擎


obj.property==”.test“
??我想他的意思是反射,获取属性,并将字符串类型的属性与“.test”进行比较。对吗?我想检查整个
UserInformation
对象是否包含“.test”,它可以是包含单词的任何属性,我相信您可以自己解决其余问题。是否要比较属性名称或其值?我想知道如何更改此方法以查找其字符串属性包含文本的列表的所有元素。
public static IEnumerable<PropertyInfo> PropertiesThatContainText<T>(T obj, string text, StringComparison comparison = StringComparison.Ordinal)
{
    var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
       .Where(p => p.PropertyType == typeof(string) && p.CanRead);
    foreach (PropertyInfo prop in properties)
    {
        string propVal = (string)prop.GetValue(obj, null);
        if (String.Equals(text, propVal, comparison)) yield return prop;
    }
}
bool anyPropertyContainsText = PropertiesThatContainText(yourUserInfo, ".test").Any();