在使用子类时遇到问题



我正在尝试从基类初始化类的实例,其中要使用的类将在切换情况下确定,如下所示:

ImportBase.cs:(父抽象类和接口)

namespace WebApi.Services.Import.Investments
{
interface IImport
{
public void Import(IFormFile file, int UserId);
}
public abstract class ImportBase : IImport
{
public abstract void Import(IFormFile file, int UserId);
}
}

ImportKuflink.cs(子类)

namespace WebApi.Services.Import.Investments
{
public class ImportKuflink : ImportBase
{
public override void Import(IFormFile file, int UserId)
{
System.Diagnostics.Debug.WriteLine("Import Kuflink");
}
}
}

ImportFleet.cs(子类)

namespace WebApi.Services.Import.Investments
{
public class ImportFleet : ImportBase
{
public override void Import(IFormFile file, int UserId)
{
System.Diagnostics.Debug.WriteLine("Import Fleet");
}
}
}

和在我的控制器中:

namespace WebApi.Controllers
{
[Route("[controller]")]
[ApiController]
public class InvestmentsController : ControllerBase
{
public void Import()
{
ImportBase importService = null;
switch(investmentEntity)
{
case "kuflink":
ImportKuflink importService = new();
break;
case "Fleet":
ImportFleet importService = new();
break;                    
}
if (importService != null)
{
importService.Import(file, UserId);
}        
}
}
}

当我尝试使用实例时,我得到错误"'importService'不存在于当前上下文中">

是否有一种方法可以测试importService是否被初始化并在case语句之外使用?

我基本上有一个基类,然后几个其他类将继承这个类,并根据类型的导入发生适当的子类将被使用。我该怎么做呢?

您的错误信息»'importService'不存在于当前上下文中»与您的程序不匹配,我怀疑所示的代码将显示此错误。

我假设你实际上看到了一个不同的错误。让我们首先将代码缩减到尽可能小的程序,以显示(a?)问题。

public class Program
{
public static void Main()
{
Console.WriteLine("Enter name:");
var input = Console.ReadLine();
Object importService = null;
switch(input)
{
case "x":
String importService = "";
break; 
}
if (importService != null)
{
Console.WriteLine(importService);
}        
}
}

c#中变量的作用域/生存期通常由它的封闭块决定。声明一个变量(用TypeName variableName)使这个变量在它的块中可见。当执行退出块时,该变量不再可访问。

用赋值操作符(如=)赋值变量,但不指定类型名,如variableName = value

块用{打开,用}关闭。块可以(任意)嵌套。内部块中的变量会对外部块的变量产生阴影。外部块的变量可以在内部块中访问,除非有阴影。

如果在内部块中声明的变量与外部块中已存在的变量名称相同,则外部块中的变量将无法被当前块及其任何子块访问。

在示例中,您有4个相关块:

  1. 开关语句
  2. if语句

方法声明了一个变量importService,并立即赋值为null:Object importService = null。声明和赋值可以分开,使其更显式:

Object importService; // declaration
importService = null; // assignment

switch语句打开一个新的块,这个块声明了一个新的独立的变量,该变量遮蔽了外部块(方法)的变量:String importService。一旦外部变量被遮蔽,就不能从内部块中访问它。内部变量的赋值对阴影变量没有影响。

换句话说:switch语句声明并赋值了一个类型为String、名称为importService的新变量,然后对不做任何操作。一旦switch语句退出,变量就消失了,不能再访问了。

离开switch语句块后,被遮蔽的变量(Object类型的importService)再次变得可访问。但是这个变量没有发生任何变化,它的值仍然是null——记住:在嵌套块中具有相同名称的变量是不同的和独立的。

你需要做些什么来"修复"?你的程序?不要用相同的名字声明一个新的变量,而是赋值原来的变量。

ImportKuflink importService = new();声明并赋值一个新的块局部变量。它不会为您现有的字段分配this.importService。两者都独立存在。[…]

public class Program
{
public static void Main()
{
Console.WriteLine("Enter name:");
var input = Console.ReadLine();
Object importService = null;
switch(input)
{
case "x":
importService = ""; // assign, don't redeclare!
break; 
}
if (importService != null)
{
Console.WriteLine(importService);
}        
}
}

最新更新