我有很简单的问题,我无法找到答案。 在Razor视图有接口类型的模型。 该接口有多个子类实现它。 现在的问题是: 我怎么能投的模式,它的实际类型 ? 我必须有实际类型的变量,但不知道如何从反射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
,因为我不知道什么实际类型是提前到来做。 其对技术,而不是架构的问题。
提前致谢!
你真是在错误的道路上这里。 你真的不能做你希望做在这里,因为你并没有真正通过思前想什么。 像这样的语句:
var actualType1 = Model as Model.GetType();
不会起作用,因为变种是不是动态类型,它是在编译时输入的,而不是在运行时静态类型。 所以,即使你能够以某种方式设法得到它的工作,那就只有一种类型,以往的工作(直到它再次被重新编译)。
除此之外,接口是这个糟糕的选择,因为接口的属性是从实现属性独立。 所以不管什么属性,你有你的课,你会不会通过这个类的一个接口得到它们。
听起来像是你有,根据你的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 { }
在你看来,你通过其中AnonymousViewModel
或UserViewModel
,那么在视图中没有逻辑:
@model SomeViewModel
@Html.EditorFor(m => m.FormField)
@Html.EditorFor(m => m.FormField2)