当前位置:  开发笔记 > 编程语言 > 正文

返回未知的通用列表<T>

如何解决《返回未知的通用列表<T>》经验,为你挑选了5个好方法。

并感谢您的帮助.

我如何从一个未知的Generic.List类型的方法返回.

public void Main()
{
  List a= GetData("A");   
}

public List GetData(string listType)
{
   if(listType == "A")
   {
     List a= new List() 
     ...
     return a; 
   }
   else
   {
     List b = new List()
     return b;

   }
}

在下面的示例中,我收到类似于以下内容的错误:无法转换ListList

这可能吗?错误发生在'return a;'上 代码行.
另外,我需要做些什么来确保线路上不会发生错误:

List a= GetData("A");   

谢谢,史蒂文



1> John Rasch..:

IList而不是List.


同意这应该是最终的目标,但它并没有真正帮助他解决眼前的问题.

2> AnthonyWJone..:

限制返回对象列表的替代方法是确保A和B派生自公共基类型或实现公共接口,然后返回该基类型或接口的列表.在Generic方法中包含一个约束: -

List GetData() where T: ICommon
{

}



3> Orion Edward..:

你不能直接返回List这样的.

为什么?基本上是因为ListList(或ListVS List这是相同的东西)被认为是2完全独立无关的类.
就像你不能string从声明返回的函数返回一个int,你不能从声明返回int列表的函数返回一个字符串List.在这里是一个有点红鲱鱼.你不能写一个返回字符串和整数的泛型方法......

有关此类事情的更多信息,请参见此处.

所以你要做的就是返回两种类型都来自的东西(它们"有共同之处".)
正如John Rasch所说,你可以返回IList,(注意非泛型,所以它只是一个objects 的列表)或者只是返回它作为一个object.遗憾的是,没有办法保留列表的类型.



4> Kevin Kibler..:

除非有特定原因导致您无法提前指定实际类型,否则您可以将方法本身设为通用:

public void Main() {
    List a = GetData();
}

public List GetData() {
     List list= new List();
     ...
     return list; 
}



5> Jon Erickson..:

编辑每个猎户座的答案,加上AnthonyWJones建议的禁令

你可能应该有一个A和B继承的接口/抽象类

    public interface IMyInterface { }
    public class A : IMyInterface { }
    public class B : IMyInterface { }

    public List GetData() where T : IMyInterface
    {
        List myList = new List();
        if (typeof(T) == typeof(A))
        {
            myList.Add(new A());
        }
        if (typeof(T) == typeof(B))
        {
            myList.Add(new B());
        }
        return myList;
    }

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有