我写了两个类的扩展方法。像这样:
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完成。还有其他方法可以做这种事情。
答案 0 :(得分:1)
您可以创建一个名为IHasName
的接口,并使Class1
和Class2
实现该接口:
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();
}