2016-08-12 55 views
2

我正在研究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 %>"> 
... 
+0

而不是“铸造它”,你可以解析它。 – null

+0

确实我可以,但那不是我想要做的。 – eTomate

+0

你确定'Container.DataItem'确实是'PartnerModel'吗?你有没有尝试先把它转换成'PartnerModel'? – rocky

回答

1

这不是接近这种情况的一个很好的方法。特别是在MVC中(但在其他类型的项目中),您应该在表示层中使用预测,而不是直接使用底层数据库模型。这就是为什么存在

项目,如AutoMapper在你的情况下,最好的做法是创建一个包含从树节点类,你想在你的改造+自定义的使用,然后在演示文稿中使用此模型的所有特性的模型。模型的

例子:

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才有效。

0

假设您绑定了一组PartnerModel对象,则可以将Container.DataItem转换为您的类型,然后访问Node属性。

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

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

你在这里真正做的是将对象(DataItem属性的类型)转换为TreeNode。编译器没有任何方法可以识别它应该使用你的操作符。

你将不得不告诉它是这样写它的源类型的确实不能给你带来希望我猜值:

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

什么你在异常看到的是从消息默认的转换运算符,它不知道您的运算符,可能没有任何代码在运行时附加一些定制,因此无法执行转换。