【发布时间】:2011-05-22 18:26:16
【问题描述】:
目前我正在为一些客户模型类使用基类。定义如下
public abstract class BaseCustomerModel<T>
where T : IUserEntity
为了进一步说明,IUserEntity 包含:
public interface IUserEntity
{
string ErrorMessage { get; }
}
该属性以及其他一些内容将在 ErrorTextControl.ascx 中公开:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<(...).Models.BaseCustomerModel<(...).IUserEntity>>" %>
<tr>
<td colspan="2"><%: Html.DisplayFor(model => model.ErrorMessage) %></td>
</tr>
我会这样调用用户控件:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<(...).Models.MyUserModel>" %>
<% if (Model.HasErrors)
{
Html.RenderPartial("ErrorTextControl", Model);
} %>
最后一段代码(MyUserEntity 实现 IUserEntity):
public class MyUserModel : BaseCustomerModel<MyUserEntity>
不幸的是,这显然不起作用,因为泛型类型不能隐式转换为 IUserEntity。因此在浏览器中导致以下错误消息:
异常详情:System.InvalidOperationException:传入字典的模型项是类型 '(...).Models.MyUserModel',但是这个字典需要一个模型项类型 '(...).Models.BaseCustomerModel`1[(...).IUserEntity]'。
所以问题:
- 是否有任何方法可以使用尚未知道其类型的通用基类来定义用户控件?如果是,如何完成?
- 如果没有,是否有任何解决方法、通用解决方案或想法能够拥有通用用户控件?
非常感谢。
【问题讨论】:
-
monty - 您需要某种将被绑定的通用接口(除了 IUserEntity )。你认出来了吗???我这样说是因为您将强键入属性集,因此这些属性将需要成为合同的一部分。如果它只是需要暴露给 ErrorTextControl.ascx 的 IUserEntity 部分,那么为什么不: " %> - 或者我是完全忽略了这里的重点:)
-
Jep,我也发现了自己……看看我发布的答案。
-
好 - 你知道这是有道理的! ;)
标签: c# .net asp.net-mvc generics casting