我试图编写一个通用的(在许多地方都有用)控件,以便在整个公司中重复使用。
我的视图和视图模型中的实际C#泛型有问题。
这是我要执行的操作的一个示例:
通用局部视图:(_Control.cshtml
)
@model SimpleExample<dynamic>
@Model.HtmlTemplate(Model.Data)
ViewData:(SimpleExample.cs
)
public class SimpleExample<T>
{
public T Data;
public Func<T, System.Web.WebPages.HelperResult> HtmlTemplate;
}
用法示例:(FullView.cshtml
)
@model Foo.MyViewData
@Html.Partial("_Control", new SimpleExample<MyViewData>
{
Data = Model,
HtmlTemplate = @<div>@item.SomeProperty</div>
})
我要寻找的功能的重要部分是,消费者在内联编写Html时会得到一个类型化的对象,以便他们可以使用Intellisense(如FullView.cshtml
)。
一切编译正常,智能感知正常,但是在运行时出现错误:
The model item passed into the dictionary is of type
'AnytimeHealth.Web.ViewData.SimpleExample`1[Foo.MyViewData]',
but this dictionary requires a model item of type
'AnytimeHealth.Web.ViewData.SimpleExample`1[System.Object]'.
我已经读过我可以在我的泛型类型上使用协方差使它起作用,但是我不确定如何做到这一点。
您能告诉我如何使它工作吗?
更改定义_Control.cshtml
:
@model SimpleExample<dynamic>
到@model dynamic
。
它会工作,但会失去的智能SimpleExample
,的智能MyViewData
仍然会起作用。
我认为这是因为动态类型将在运行时知道,但是泛型的类型
需要一个较早的时间(也许是编译时间),这时object
才是已知的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句