2

我有一个非常简单的问题,我找不到答案。在剃刀视图中有一个接口类型的模型。该接口有多个实现它的子类。问题是:如何将模型转换为实际类型?我必须有实际类型的变量,但不知道如何从反射 IE 中获取它

@model IInterface
@{
   var actualType1 = Model as Model.GetType(); // doesn't work :(
   var actualType2 = (Model.GetType()) Model; // doesn't work :(
}

正如您可以想象的那样,我不感兴趣,Model as ActualType或者(ActualType) Model因为我不知道提前会出现什么实际类型。这是一个关于技术而不是架构的问题。

提前致谢!

4

2 回答 2

2

你在这里真的走错了路。你不能在这里真正做你想做的事情,因为你并没有真正考虑清楚。像这样的声明:

var actualType1 = Model as Model.GetType(); 

不起作用,因为 var 不是动态类型,它是在编译时而不是在运行时键入的静态类型。因此,即使您可以设法让它工作,它也只能用于一种类型(直到它再次重新编译)。

除此之外,接口是一个糟糕的选择,因为接口属性与实现属性是分开的。因此,无论您的类有什么属性,您都不会通过该类的接口获取它们。

于 2012-08-06T16:28:06.287 回答
0

根据您的 OP 评论,听起来您有一些数据注释问题。我强烈建议完全重新创建一些使用MetadataType的模型和接口。

public SomeViewModel
{
  public string FormField { get; set; }
  public string FormField2 { get; set; }
}

public interface IAnonymousSomeViewModel
{
  [Required]
  public string FormField { get; set; }
  [Scaffold(false)]
  public string FormField2 { get; set; }
}


public interface IUserSomeViewModel
{
  [Scaffold(false)]
  public string FormField { get; set; }
  [Required]
  public string FormField2 { get; set; }
}

[MetadataType(typeof(IAnonymousSomeVieModel)]
public AnonymousViewModel : SomeViewModel { }


[MetadataType(typeof(IUserSomeVieModel)]
public UserViewModel : SomeViewModel { }

在您的视图中,您通过AnonymousViewModelor UserViewModel,则视图中没有逻辑:

@model SomeViewModel

@Html.EditorFor(m => m.FormField)

@Html.EditorFor(m => m.FormField2)
于 2012-08-06T16:25:28.560 回答