【问题标题】:Explicit operator cast on runtime运行时显式运算符强制转换
【发布时间】:2016-08-12 09:21:32
【问题描述】:

我正在 Kentico 开发一个 asp.net 项目。

目前我创建了一个模型,我们称之为 PartnerModel。它包含一个 TreeNode 类型的私有变量,它基本上以不同的形式保存相同的信息。

我希望能够将 PartnerModel 的实例显式转换为 TreeNode。 这应该在运行时发生(在 WebForms 用户控件中)。

编辑:我不是在寻找“更好”的方法来实现我所要求的目标。这更像是一个没有明确用例的通用目的。下面的代码正是我试图做的。我只是想知道,是否可以在运行时显式转换我的模型,如果可以,我该怎么做。

这可能吗?我只是得到一个 InvalidCast 异常。

PartnerModel.cs

public class PartnerModel
{
        #region Public Properties

        public TreeNode Node { get { return node; } }
        ...
        public static explicit operator TreeNode(PartnerModel model)
        {
            return model.node;
        }
}

PartnerOverview.ascx

...
<cms:BasicRepeater runat="server" ID="RepeaterPartner">
                <ItemTemplate>
                    <a href="<%# ((CMS.DocumentEngine.TreeNode)Container.DataItem).RelativeURL %>">
...

【问题讨论】:

  • 您可以解析它,而不是“强制转换”。
  • 确实可以,但这不是我想要做的。
  • 你确定Container.DataItem 真的是PartnerModel 吗?您是否尝试过先将其转换为 PartnerModel
  • 异常状态:“消息:无法将'CMSApp.Models.PartnerModel'类型的对象转换为'CMS.DocumentEngine.TreeNode'类型。”。所以是的 - 我有点确定它是:)

标签: c# asp.net webforms kentico ascx


【解决方案1】:

这不是处理这种情况的好方法。尤其是在 MVC(以及其他类型的项目)中,您应该在表示层中使用 projections 而不是直接使用底层数据库模型。这就是 AutoMapper 这样的项目存在的原因

在您的情况下,最佳做法是创建一个模型,其中包含您要在转换中使用的 TreeNode 类的所有属性 + 自定义属性,然后在演示文稿中使用此模型。

模型示例:

public class PartnerViewModel
{
    // partner specific properties
    public string PartnerName { get; set; }
    public int PartnerID { get; set; }

    // node properties
    public int NodeID { get; set; }
    public string NodeName { get; set; }
}

在您的表示层中,您应该只使用这个PartnerViewModel

【讨论】:

    【解决方案2】:

    假设您正在绑定PartnerModel 对象的集合,您可以将Container.DataItem 强制转换为您的类型,然后访问Node 属性。

    ...
    <cms:BasicRepeater runat="server" ID="RepeaterPartner">
        <ItemTemplate>
            <a href="<%# ((PartnerModel)Container.DataItem).Node.RelativeURL %>">
    ...
    

    【讨论】:

      【解决方案3】:

      C# 中的强制转换运算符,无论是隐式还是显式都在编译时处理(使用编译时可用的类型信息),它只是语法糖。

      您在这里真正要做的是将 Object(DataItem 属性的类型)转换为 TreeNode。编译器真的没有办法识别它应该使用你的操作符。

      你必须通过这样写来告诉它什么是源类型,这真的不会带来我猜你期望的值:

      <%# ((CMS.DocumentEngine.TreeNode)(PartnerModel)Container.DataItem).RelativeURL %>
      

      您在异常中看到的是来自默认转换运算符的消息,它不了解您的运算符,并且可能没有任何代码可以在运行时附加一些自定义,因此无法执行转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多