2008-12-10 136 views
0

我有两个类:媒体和容器。列表泛型和铸造

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

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

它可以是一个或另一个;

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

或者我应该只是尝试将其转换为列表<>并将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"); 

回答

3

可以使用类型类型,像这样的方法GetGenericArguments:

对象[]模板= myObject.GetType()GetGenericArguments();

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 
} 
2

什么大卫说。

但是,如果这必须通过相同的功能,typeof运营商应该帮助。此外,这听起来更像是你有一个建筑缺陷。 Media类与Container类相关的方式如何?他们应该使用两种通用界面吗?

+0

是的,它应该共享相同的功能 - 它是一个事件处理程序 – 2008-12-10 20:19:23

0

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

声明接口命名ICanDoThis

public interface ICanDoThis { void DoThis(); } 

确保媒体和容器实现该接口

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

和那么,在你的客户端代码“其他功能”,你可以

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

就是这样...此代码将调用相应的实施无论是在媒体类或容器类这取决于实际的具体类型对象是,没有你必须编写代码来区分它们...

+0

这将不会工作,直到.NET 4.0出来。通用参数还不知道继承。 – 2008-12-10 20:32:22