2016-01-22 67 views
0

C#泛型方法我想創建這樣一個泛型方法:這需要多個類

public static List<T> Filter(this List<T> list, string search) where T : class 
{ 
    return list.Where(t => t.Name.FormatSearch().Contains(search)).ToList(); 
} 

而且是ALBE來調用不同的類此方法,並得到相同的結果,因爲這兩個類都有大多相同的屬性。

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

你的代碼出了什麼問題? –

+0

聽起來像你想'A'和'B'有一個共同的界面也許 - 這不是很清楚(我)你在問什麼。 –

+3

@AntonioPapa你應該創建接口'IName'並在那裏聲明'Name'屬性。 'A'和'B'應該實現'IName'。之後寫'T'參數約束如下'where T:IName'。之後,你將避免t.Name ...下的紅線。 – tchelidze

回答

4

的一種方式做到這一點是建立InterfaceIName,並宣佈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

這就是答案謝謝:) –

+0

@AntonioPapa很高興如果幫助 – tchelidze

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