列出泛型和铸件

时间:2008-12-10 20:01:31

标签: c# generics casting

我有两个类:Media和Container。

我有两个列表List<Media>List<Container>

我将这些列表传递给另一个函数(一次一个);

它可以是一个或另一个;

检查列表的“模板”类型的正确方法是什么,这样我可以根据列表类型调用一个相关的方法?

或者我应该尝试转换为List&lt;&gt;并把Try / Catch块放在它周围?

    Object tagObj = mediaFlow1.BackButton.Tag;

    if (tagObj == Media)
       //do this
    else if (tagObj == Container)
        //do this
    else
        throw new Exception("Not a recognized type");

4 个答案:

答案 0 :(得分:11)

正确的做法是为此函数设置两个重载,接受每种类型:

public void MyMethod(List<Media> source)
{
  //do stuff with a Media List
}

public void MyMethod(List<Container> source)
{
  //do stuff with a Container List
}

答案 1 :(得分:3)

您可以使用Type类型的GetGenericArguments方法,如下所示:

object [] templates = myObject.GetType()。GetGenericArguments();

答案 2 :(得分:2)

大卫说的话。

但如果必须通过相同的功能,typeof运算符应该有帮助。此外,这听起来更像是你有一个建筑缺陷。 Media类与Container类有什么关系?他们应该实现两种共同的接口吗?

答案 3 :(得分:0)

嗯,这取决于你的“//做这个”方法是什么......如果它是一个在Media或Container对象上运行的方法,并根据它做不同的事情,那么你应该放那些类中的那个方法......

声明名为ICanDoThis的接口

public interface ICanDoThis { void DoThis(); }

确保Media和Container都实现该接口

public class Media: ICanDoThis { // }
public class Container: ICanDoThis { // }

然后,在您的客户端代码“其他功能”中,您可以

 public void OtherFunction(List<ICanDoThis> list)
 {
    foreach(ICanDoThis obj in list)
        obj.DoThis();
 }

就是这样......这段代码将在Media Class或Container类中调用相应的实现,具体取决于实际对象的具体类型,而不必编写代码来区分它们......