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

时间:2017-08-24 10:26:53

标签: c#

我有<p>{{email | hideEmail}}</p>

的列表
UserInformation

UserInformation对象如下所示;

List<UserInformation> ui = new List<UserInformation>();

有没有办法检查这些属性是否包含特定的Word?让我们说“.test”?

更新

我有点想避免像

这样的事情
public class UserInformation
{
    public UserInformation()
    {
    }

    public UserInformation(UserInformation u)
    {
        this.Id = u.Id;
        this.parentId = u.parentId;
        this.Name = u.Name;
        this.Title = u.Title;
        this.Department = u.Department;
        this.Image = u.Image;
        this.Parent = u.Parent;
        this.Username = u.Username;
        this.Company = u.Company;
        this.Initials = u.Initials;
        this.Disabled = u.Disabled;
    }

    public int Id { get; set; }
    public int? parentId { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }
    public string Department { get; set; }
    public string Image { get; set; }
    public string Parent { get; set; }
    public string Username { get; set; }
    public string Company { get; set; }
    public string Initials { get; set; }
    public bool Disabled { get; set; }
}

2 个答案:

答案 0 :(得分:0)

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

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();

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

答案 1 :(得分:0)

你可以像DavidG指出的那样使用运行时反射;

How to iterate all "public string" properties in a .net class

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

https://msdn.microsoft.com/en-us/library/bb126445.aspx

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

https://lucene.apache.org/