2017-01-09 91 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())) 
相关问题