运行时显式运算符

时间:2016-08-12 09:21:33

标签: c# asp.net webforms kentico ascx

我正在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 %>">
...

3 个答案:

答案 0 :(得分:1)

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

在您的情况下,最佳做法是创建一个Model,其中包含您希望在转换+自定义类中使用的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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

您在这里真正做的是将Tree(DataItem属性的类型)转换为TreeNode。编译器实际上没有任何方法可以识别它应该使用您的运算符。

你必须通过这样写它来告诉它什么是源类型,它实际上并没有带来你所期望的价值:

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

您在异常中看到的是来自默认投射操作员的消息,该操作员不了解您的操作员,并且可能没有任何代码在运行时附加某些自定义,因此不是能够执行转换。