2016-08-12 8 views
2

私はKenticoのasp.netプロジェクトに取り組んでいます。実行時の明示的な演算子キャスト

現在、モデルを作成しました。それをPartnerModelとしましょう。基本的に同じ情報を別の形式で保持する、TreeNode型のプライベート変数を含んでいます。

TreeNodeに明示的なPartnerModelのインスタンスをキャストできます。 これは実行時(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などのプロジェクトが存在する

あなたの場合は、変換+カスタムで使用するTreeNodeクラスのすべてのプロパティを含むモデルを作成し、このモデルをプレゼンテーションで使用することをお勧めします。

モデルの例:あなたはこれだけPartnerViewModelで動作するはずです、あなたのプレゼンテーション層で

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; } 
} 

0

PartnerModelオブジェクトのコレクションをバインドすると仮定すると、Container.DataItemを型にキャストし、Nodeプロパティにアクセスできます。 C#で

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

キャスト演算子は、暗黙的または明示的にコンパイル時に処理されるかどうかを(コンパイル時に入手可能なタイプの情報を使用)、それだけで構文糖です。

ここで実際に行うことは、Object(DataItemプロパティの型)をTreeNodeにキャストすることです。コンパイラは実際にあなたの演算子を使用する必要があることを認識する方法はありません。あなたは本当にあなたが私が推測する期待値をもたらすものではありません。このようにそれを書き込むことにより、ソースの種類が何であるかということを教えなければならないだろう

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

何を例外に見ることからのメッセージですあなたのオペレータを知らず、実行時にいくつかのカスタマイズをアタッチするコードがないため、変換を実行できないデフォルトのキャスト演算子です。

関連する問題