需要多个类的C#泛型方法

时间:2016-01-22 15:54:43

标签: c# generics

我想创建一个像这样的通用方法:

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的工作方式相同。我在第一种方法中缺少什么?

2 个答案:

答案 0 :(得分:4)

这样做的一种方法是创建Interface IName并在那里声明Name属性。

AB应该实施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();  
}