Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列出泛型和类型转换_C#_Generics_Casting - Fatal编程技术网

C# 列出泛型和类型转换

C# 列出泛型和类型转换,c#,generics,casting,C#,Generics,Casting,我有两个类:媒体和容器 我有两个列表List和List 我将这些列表传递给另一个函数(一次一个) 它可以是一个或另一个 检查列表的“模板”类型以便根据列表类型调用关联方法的正确方法是什么 或者我应该试着对列表进行强制转换并在其周围放置try/Catch块吗 Object tagObj = mediaFlow1.BackButton.Tag; if (tagObj == Media) //do this else if (tagObj == Containe

我有两个类:媒体和容器

我有两个列表
List
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
}
public void MyMethod(列表源)
{
//用媒体列表做一些事情
}
公共void MyMethod(列表源)
{
//用容器列表做一些事情
}
大卫说的话


但是,如果必须通过相同的功能,操作员应该提供帮助。而且,这听起来更像是你有一个架构缺陷。媒体类与容器类的关系如何?两者是否都应该实现一些共同的接口?

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


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

好吧,这取决于你的“//do this”方法是什么。。。如果它是一个在媒体或容器对象上运行的方法,并且基于它执行不同的操作,那么您应该将该方法放在这些类中

声明一个名为ICanDoThis的接口

public interface ICanDoThis { void DoThis(); }
确保媒体和容器都实现了该接口

public class Media: ICanDoThis { // }
public class Container: ICanDoThis { // }
然后,在客户端代码“其他函数”中,您可以

public void OtherFunction(列表)
{
foreach(ICanDoThis obj在列表中)
obj.DoThis();
}

就这样。。。此代码将根据实际对象的具体类型在媒体类或容器类中调用相应的实现,而无需编写代码来区分它们

是的,它应该共享相同的功能——它是一个EventHandler。在.NET4.0问世之前,它是不会工作的。泛型参数还不知道继承。我以前用基类做过。。这就是通用where:interface语法的含义。。。你是说它不存在;接口继承无效?接口继承无效:列表不从列表继承。如果OtherFunction是泛型的,则可以将接受的类型限制为实现ICanDoThis且有效的类型。public void OtherFunction(列表),其中T:ICanDoThis
 public void OtherFunction(List<ICanDoThis> list)
 {
    foreach(ICanDoThis obj in list)
        obj.DoThis();
 }