我想创建一个像这样的通用方法:
public static List<T> Filter(this List<T> list, string search) where T : class
{
return list.Where(t => t.Name.FormatSearch().Contains(search)).ToList();
}
并且要在不同的类上调用此方法并获得相同的结果,因为这两个类的属性大多相同。
class A {
public string Name;
}
class B {
public string Name;
}
var a = new List<A>();
var b = new List<B>();
a.Filter();
b.Filter();
我希望过滤方法对A和B的工作方式相同。我在第一种方法中缺少什么?
答案 0 :(得分:4)
这样做的一种方法是创建Interface
IName
并在那里声明Name
属性。
A
和B
应该实施IName
。
编写T
参数约束,如下where T : IName
之后,您将避免t.Name...
尝试以下操作。
using System.Collections.Generic;
using System.Linq;
namespace TestField
{
class Program
{
private static void Main(string[] args)
{
var a = new List<A>();
var b = new List<B>();
a.Filter("string");
b.Filter("string");
}
}
public static class Extensions
{
public static List<T> Filter<T>(this IEnumerable<T> list, string search)
where T : IName
=> list.Where(t => t.Name.Contains(search)).ToList();
}
public interface IName
{
string Name { get; set; }
}
public class A : IName
{
public string Name { get; set; }
}
public class B : IName
{
public string Name { get; set; }
}
}
答案 1 :(得分:1)
@tchelidze给出了答案,这就是我想要做的事情:
public interface IName
{
string Name { set; get; }
}
class A : IName {
public string Name
}
class B : IName {
public string Name
}
public static List<T> Filter<T>(this List<T> list, string search) where T : IName
{
return list.Where(t => t.Name.FormatSearch().Contains(search)).ToList();
}