2016-08-12 65 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 %> 

什麼你在異常看到的是從消息默認的轉換運算符,它不知道您的運算符,可能沒有任何代碼在運行時附加一些定製,因此無法執行轉換。