Динамическая переменная - это лучший способ, чтобы динамически назначать?


Обычно я могу просто объявить 'электронной почты' переменная в качестве базового класса для EmailInbound & EmailOutbound, затем бросил-до унаследованного класса. Однако, я не думаю, что при определении эф классов codefirst вы можете использовать наследуемые классы, только покос. Я могу ошибаться. Поэтому я использовал ключевое слово dynamic. Я мог бы использовать Object() вместо этого? Некоторые направления оценили здесь...

             if (source.ActionTypeId == (int)ActionTypes.EmailInbound  ||
                source.ActionTypeId == (int)ActionTypes.EmailOutbound)
            {
                dynamic email;
                if ( source.ActionTypeId == (int)ActionTypes.EmailInbound )
                {
                    email = source.EmailMessage.EmailInbound;
                }
                else
                {
                    email = source.EmailMessage.EmailOutbound;
                }

                return new ActionModel
                {
                    ActionTypeId = (ActionTypes)source.ActionTypeId,
                    Content = email.Body,
                    Created = email.DateSent,
                    GravatarUrl = HtmlHelperExtensions.getGravatarUrl(email.FromAddress, 25),
                    Subject = email.Subject,
                    User = Mapper.Map<User, UserModel>(source.EmailMessage.User),
                    EmailReplyTo = email.From,
                    ShowReplyButton = true,
                    ThreadUid = source.ThreadUid,
                    IsReply = source.IsReply
                };
            }
...


428
3
задан 8 июля 2011 в 02:07 Источник Поделиться
Комментарии
1 ответ

Я думаю, что это вполне обоснованная использовать динамический здесь. Я не слишком знаком с EF, но это вполне может быть, что вы не можете сделать тип-совместимых объектов.

Даже если вы могли, я бы не сделать это, если это было только, чтобы сделать этот кусок рабочего кода.

Объявления по электронной почте в качестве объекта не поможет в любом случае.

Единственной альтернативой я могу думать о том, чтобы иметь два пути кода для обоих случаев:

            if ( source.ActionTypeId == (int)ActionTypes.EmailInbound )
{
email = source.EmailMessage.EmailInbound;
return new ActionModel
{
ActionTypeId = (ActionTypes)source.ActionTypeId,
Content = email.Body,
Created = email.DateSent,
GravatarUrl = HtmlHelperExtensions.getGravatarUrl(email.FromAddress, 25),
Subject = email.Subject,
User = Mapper.Map<User, UserModel>(source.EmailMessage.User),
EmailReplyTo = email.From,
ShowReplyButton = true,
ThreadUid = source.ThreadUid,
IsReply = source.IsReply
};
}
else
{
email = source.EmailMessage.EmailOutbound;
return new ActionModel
{
ActionTypeId = (ActionTypes)source.ActionTypeId,
Content = email.Body,
Created = email.DateSent,
GravatarUrl = HtmlHelperExtensions.getGravatarUrl(email.FromAddress, 25),
Subject = email.Subject,
User = Mapper.Map<User, UserModel>(source.EmailMessage.User),
EmailReplyTo = email.From,
ShowReplyButton = true,
ThreadUid = source.ThreadUid,
IsReply = source.IsReply
};
}

Но я думаю, что решение с динамическими лучше. Вы не можете поймать все ошибки во время компиляции. Я бы рекомендовал модульный тест (два на самом деле) так что если кто-нибудь изменения схемы базы данных, это определяется во время сборки.

2
ответ дан 12 июля 2011 в 07:07 Источник Поделиться