2017-01-09 95 views
1

這是我的C#代碼,我想使用「DisplayList」來檢查類型T是否是我的自定義類型自定義,然後使用我的DisplayInterval函數來打印它。不能將T轉換爲間隔(我自己的自定義類型)

但是有一個錯誤,無法將T轉換爲視覺工作室中的間隔。我不知道我的代碼有什麼問題。

希望有人能給我一個答案。

public class Interval 
{ 
    public int start; 
    public int end; 
    public Interval() { start = 0; end = 0; } 
    public Interval(int s, int e) { start = s; end = e; } 
} 

public static void DisplayInterval(Interval inter) 
{ 
    Console.Write(" [{0},{1}]",inter.start,inter.end); 
} 

public static void DisplayList<T>(IList<T> list) 
{ 
    foreach (T element in list) 
    { 
     if (element.GetType() == typeof(Interval)) 
      DisplayInterval(element); 

     else 
      Console.WriteLine(element); 
    } 
} 
+3

不這樣做,只是重寫該類型的'ToString'來定義它應該如何顯示。或者,至少不要使該方法具有通用性,因爲它實際上不是通用的。讓它接受一個'List ',因爲這就是你實際上支持的。 – Servy

+0

定義'ToString'看起來有爭議:對象不應該知道它應該如何打印到控制檯,除非它是它的主要責任。 – zerkms

+0

我沒說你不能。我說你不應該。它不會縮放。當你從現在開始一個小時後再創建一個新對象,並在接下來的幾個星期再次創建一個新對象,並在接下來的幾個月內再創建一個新對象。 – Servy

回答

5

只需添加鑄造:

DisplayInterval((Interval)element); 

有時它也很好地覆蓋您的自定義類的ToString方法:

public class Interval 
{ 
    public int start; // consider to use properties: public int Start {get;} 
    public int end; 
    public Interval(): this (0,0) { } // you can call second constructor here 
    public Interval(int s, int e) { start = s; end = e; } 

    public override string ToString() 
    { 
     return $"[{start},{end}]"; 
    } 
} 

有了您的ToString你可以簡單地重複而不元素定義檢查其類型:

public static void DisplayList<T>(IList<T> list) 
{ 
    foreach (T element in list) 
    { 
     Console.WriteLine(element); 
    } 
} 

順便說一句你的原始解決方案 - 你不需要檢查列表中的每個元素的類型。因此它們都具有相同的類型。您只能檢查通用參數的類型。或者更好 - 創建單獨的方法來顯示IList<Interval>

+0

好方法「檢查類型T是否是我的自定義類型」 – Igor

+0

@Igor對不起,沒有得到你 –

+1

我的意思是,如果'element'不是'Interval',那麼'(Interval)元素'拋出異常當然,可以看作是「檢查」 – Igor

2
public static void DisplayList<T>(IList<T> list) 
{ 
    foreach (T element in list) 
    { 
     var interval = element as Interval; 
     if (interval != null) 
      DisplayInterval(interval); 
     else 
      Console.WriteLine(element); 
    } 
} 
0

你只需要轉換任何類型的元素是一個區間是這樣的: 公共類間隔 { 公衆詮釋啓動; public int end; public Interval(){start = 0; end = 0;公共區間(int s,int e){start = s;} public Interval end = e; }}

public static void DisplayInterval(Interval inter) 
{ 
    Console.Write(" [{0},{1}]",inter.start,inter.end); 
} 

public static void DisplayList<T>(IList<T> list) 
{ 
    foreach (T element in list) 
    { 
     if (element.GetType() == typeof(Interval)) 
      DisplayInterval((Interval)element); 
     else 
      Console.WriteLine(element); 
    } 
} 

注意:如果從繼承區間可能需要改變你的類型比較喜歡的東西

if (element is Interval) 

OR

if(typeof(Interval).IsAssignableFrom(element.GetType())) 
相關問題