繁体   English   中英

在C#中返回多个类

[英]Returning multiple classes in c#

我有一个函数,根据输入字符串返回一个新类。

private classX GetData(string id)
{
   if (id == "-string1")
       return new class1(this, @"path");
   if (id == "-string2")
       return new class2(this, @"path");
   if (id == "-string3")
       return new class3(this, @"path");

   // ...

   return null;
}

问题是,我想有一个条件(例如“ -all”)一个接一个地返回每个单个类。 我不知道该怎么做。 有什么办法可以一一返回这些类吗? 因为我确实知道它不能与'return'一起使用,因为它会结束代码,因此其余代码无法访问。

首先,如果可能的话,应该使所有类都实现一个公共接口,或者从一个公共抽象基类继承。

例如:

public interface IMyInterface
{
    // ...
}

public class ClassX : IMyInterface
{
    // ...
}

public class ClassY : IMyInterface
{
    // ...
}

public class ClassZ : IMyInterface
{
    // ...
}

要么:

public abstract class MyBaseClass
{
    // ...
}

public class ClassX : MyBaseClass
{
    // ...
}

public class ClassY : MyBaseClass
{
    // ...
}

public class ClassZ : MyBaseClass
{
    // ...
}

然后您可以实现GetData()方法作为IEnumerable<IMyInterface> (或IEnumerable<MyBaseClass>如果使用一个抽象基类,而非接口)。

例如:

public static IEnumerable<IMyInterface> GetData(string id)
{
    if (id == "-string1" || id == "-all")
        yield return new ClassX();

    if (id == "-string2" || id == "-all")
        yield return new ClassY();

    if (id == "-string3" || id == "-all")
        yield return new ClassX();
}

您将在foreach使用它:

foreach (var item in GetData("-all"))
{
    // ...
}

如果您不想或不能使用公共基类或接口,则必须通过将GetData()声明为以下方式来返回对象:

 public static IEnumerable<object> GetData(string id)

我看不出你这样做的意义。 在使用它们之前,您可能必须知道返回的类型是什么,并进行相应的转换,这使得使用它们极为不便。

像这样使用多态(或接口,取决于您的实现)

 public baseX 
 {}

 public classX : baseX 
 {}

并将函数返回值更改为baseX的列表:

private list<baseX> GetData(string id)
{
   list<baseX> returnList = new list<baseX>();

   if (id == "-string1")
       return returnList.add( new class1(this, @"path") );
   if (id == "-string2")
       return returnList.add( new class2(this, @"path") );
   if (id == "-string3")
       return returnList.add( new class3(this, @"path") );

   // ...

   if (id == "-All")
   {
       returnList.add( new class1(this, @"path") );
       returnList.add( new class2(this, @"path") );
       returnList.add( new class3(this, @"path") );
       // .....
   }

   return returnList;
}

只要使其返回一个classX数组即可。 除了使用数组或列表外,实际上没有其他方法

您可以更改函数以返回Array,然后遍历该数组。 如果是一个类,它将是数组的第一个元素。

您必须返回实例的集合,而不是单个实例。 如果classX是class1,2,3的基类,则仅返回classX的IEnumerable而不是单个实例。 然后,您可以使用yield return返回所需的类1到3的所有实例。

话虽如此,这是生成您的类的一种非常奇怪的方式,因此我不建议您这样做。

暂无
暂无

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

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