铸造对象取决于其类型
本文关键字:类型 取决于 对象 | 更新日期: 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.
}
您可能需要将RegisterViewModel
和RegisterSellerViewModel
通用的方法提取到一个接口中,并在这两个类中实现。然后将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类型,这将导致运行时错误。