Явный оператор приведение во время выполнения

Я работаю над проектом 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 ответа

Это не очень хороший способ приблизиться к этому сценарию. Особенно в MVC (но также и в других типах проектов) вы должны использовать проекции на уровне презентации вместо непосредственного использования базовых моделей баз данных. Вот почему существуют такие проекты, как 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,

Операторы приведения в C#, неявные или явные, обрабатываются во время компиляции (используется информация о типе, доступная во время компиляции), это просто синтаксический сахар.

То, что вы действительно делаете здесь, это приведение Object (тип свойства DataItem) к TreeNode. Компилятор на самом деле не имеет никакого способа распознать его должен использовать ваш оператор.

Вам нужно будет сказать, что это за тип источника, написав его так, что на самом деле не дает ожидаемого значения:

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

В этом исключении вы видите сообщение от оператора приведения по умолчанию, которое не знает о вашем операторе и, вероятно, не имеет никакого кода для присоединения какой-либо настройки во время выполнения, и поэтому не может выполнить преобразование,

Предполагая, что вы связываете коллекцию PartnerModel объекты, которые вы можете разыграть Container.DataItem к вашему типу, а затем получить доступ к Node имущество.

...
<cms:BasicRepeater runat="server" ID="RepeaterPartner">
    <ItemTemplate>
        <a href="<%# ((PartnerModel)Container.DataItem).Node.RelativeURL %>">
...
Другие вопросы по тегам