[英]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.