列表泛型和铸造
问题描述:
我有两个类:媒体和容器。列表泛型和铸造
我有两个列表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");
答
可以使用类型类型,像这样的方法GetGenericArguments:
对象[]模板= myObject.GetType()GetGenericArguments();
答
正确的事情是有两个重载这个函数,接受每一种类型:
public void MyMethod(List<Media> source)
{
//do stuff with a Media List
}
public void MyMethod(List<Container> source)
{
//do stuff with a Container List
}
答
那么,这取决于你的“//做这个”方法是什么......如果它是一种方法,在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
是的,它应该共享相同的功能 - 它是一个事件处理程序 – 2008-12-10 20:19:23