C#类linq扩展

时间:2018-12-31 06:59:59

标签: c# linq

我写了两个类的扩展方法。像这样:

    public static ICollection<Class1> ExceptTestUser(this ICollection<Class1> list)
    {
        Func<Class1, bool> _func = i => !i.Name.Equals("Test", StringComparison.InvariantCultureIgnoreCase);
        return list.Where(_func).ToList();
    }



    public static ICollection<Class2> ExceptTestUser(this ICollection<Class2> list)
    {
        Func<Class2, bool> _func = i => !i.Name.Equals("Test", StringComparison.InvariantCultureIgnoreCase);
        return list.Where(_func).ToList();
    }

Class1和Class2都具有Name属性。

这很好用,但是,我很好奇是否有什么方法可以为此创建通用方法来传递类型T。

我认为,这可以通过使用System.Linq.Dynamic完成。还有其他方法可以做这种事情。

2 个答案:

答案 0 :(得分:1)

您可以创建一个名为IHasName的接口,并使Class1Class2实现该接口:

interface IHasName {
    string Name { get; }
}

class Class1 : IHasName {
    ...
}

class Class2 : IHasName {
    ...
}

然后,您可以编写像这样的单个方法:

public static ICollection<T> ExceptTestUser<T>(this ICollection<T> list) where T : IHasName
{
    Func<T, bool> _func = i => !i.Name.Equals("Test", StringComparison.InvariantCultureIgnoreCase);
    return list.Where(_func).ToList();
}

答案 1 :(得分:1)

如果要对没有接口的类使用相同的扩展方法,则需要使用反射来获取属性。

// Uses reflection to return value of the property or null
public static T GetPropValue<T>(this object src, string propName) where T : class
{
    return src.GetType().GetProperty(propName)?.GetValue(src, null) as T;
}

public static ICollection<T> ExceptTestUser<T>(this ICollection<T> list)
{
    // If property exists, do equality check, otherwise just accept the value
    Func<T, bool> _func = i => !i.GetPropValue<string>("Name")?.Equals("Test", StringComparison.InvariantCultureIgnoreCase) ?? true;
    return list.Where(_func).ToList();
}