铸造对象取决于其类型

本文关键字:类型 取决于 对象 | 更新日期: 2023-09-27 18:00:05

我为业务规则制定了一种验证方法,这些规则没有从模型中的规则中得到验证,但我在使其工作时遇到了问题。由于存在两种可能的场景(客户或卖家注册),因此需要在各自的视图和模型中分别对待它们。卖家注册继承了客户注册的基本信息,因此客户中的所有字段也都在卖家中。但由于我使用的是两个不同的模型,即使这两个模型都有相同的字段,我也需要使用Object来使用相同的验证方法。但不幸的是,我很难做到这一点。

[CustomHandleError]
private bool ValidateRegistrationForm (Object registerViewModelObject) {
    if (registerViewModelObject is RegisterViewModel)
    {
        RegisterViewModel registerViewModel = 
            (RegisterViewModel)registerViewModelObject;
    }
    else
    {
        RegisterSellerViewModel registerViewModel = 
            (RegisterSellerViewModel)registerViewModelObject;
    }
    if (ModelState.IsValid)
    {
        string [] names = registerViewModel.Name.Split (
            new string [] {" "}, StringSplitOptions.RemoveEmptyEntries);
        if (names.Length == 1)
            ModelState.AddModelError ("Name", "Fill your full name");
        if (CustomerUtilities.IsCpf (registerViewModel.Identity) == false)
            ModelState.AddModelError ("Identity", "Invalid CPF value");
        if (this.AuthenticatorService.IsExistentUser (registerViewModel.Email))
            ModelState.AddModelError ("Email", "Email already registered");
    }
}

正如您所看到的,在if (ModelState.IsValid)之后,IntelliSense在当前上下文中找不到registerViewModel。我想知道为什么会发生这种情况,因为该变量是在上面的if AND the else中定义的,所以如果不定义它,就无法访问该代码。

有没有解决方法(除了创建一个新方法或传递2个变量)?

铸造对象取决于其类型

在if块范围外声明RegisterViewModel,并在if块内赋值。

RegisterViewModel registerViewModel;
if (registerViewModelObject is RegisterViewMOdel)
{
     registerViewModel = // ...
}
else
{
     registerViewModel = // ...
}

如果希望有两个独立的变量,则在If语句之外声明这两个变量,然后测试是否为null。

RegisterViewModel registerViewModel;
RegisterSellerViewModel sellerModel; 
if (registerViewModelObject is RegisterViewModel)
{
    registerViewModel = (RegisterViewModel)registerViewModelObject;
}
else
{
    sellerViewModel = (RegisterSellerViewModel)registerViewModelObject;
}

然而,定义一个要使用的接口而不是Object将是更好的选择。

public interface IRegisterViewModel
{
    public string Name { get; set;}
    public ... Identity {get; set;}
    ...
}
public class RegisterViewModel : IRegisterViewModel
{
    ...
}
public class RegisterSellerViewModel : IRegisterViewModel
{
    ...
}

然后使用ValidateRegistrationForm(IRegisterViewModel registerViewModel),就可以完全去掉if语句。

您应该在if语句的外部定义RegisterViewModel。并在if语句中进行分配。

喜欢;

RegisterViewModel registerViewModel;
if(...)
{
  //make your assigment here.
}

您可能需要将RegisterViewModelRegisterSellerViewModel通用的方法提取到一个接口中,并在这两个类中实现。然后将registerViewModelObject强制转换为此接口,而不管其实际类型如何。

由于在函数的主作用域中没有定义一个变量,因此会出现问题。按照您编写代码的方式,您定义了位于不同范围内的两个变量。

我将如何着手解决方案:

我会做一个基类。

class RegisterModel
{
   public string Name;
   public IdentifyType Identify;
   public string Email;
}

然后,您的两个类都可以从基类继承。像这样:

class RegisterViewModel
   : RegisterModel
{...}
class RegisterSellerViewModel
   : RegisterModel
{...}

现在,您可以在函数中隐藏Object变量一次。像这样:

private bool Validate(Object viewModel)
{
   var castViewModel = (RegisterModel)viewModel;
   if(ModelState.IsValid)
   {
      ...
   }
}

请注意,如果viewModel不是RegisterModel类型,这将导致运行时错误。