繁体   English   中英

列出泛型和强制转换

[英]List Generics and Casting

我有两节课:媒体和容器。

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

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

它可以是一个或另一个;

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

还是我应该尝试转换为List <>并在其周围放置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");

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

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

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

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

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

大卫说了什么。

但是,如果必须通过相同的函数,则typeof运算符应该有所帮助。 同样,这听起来更像是您在体系结构上存在缺陷。 Media类与Container类有什么关系? 两者都应该使用一些通用的接口吗?

好吧,这取决于您的“ //执行此”方法是什么...如果它是在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类或Container类中调用适当的实现,而无需编写代码来区分它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM