Нет, Вы не можете назвать одного конструктора от другого в C++ 03 (названным конструктором делегирования).
Это изменилось в C++ 11 (иначе C++ 0x), который добавил поддержку следующего синтаксиса:
(пример, взятый от Википедия )
class SomeType
{
int number;
public:
SomeType(int newNumber) : number(newNumber) {}
SomeType() : SomeType(42) {}
};
Анонимные типы не могут быть возвращены методом; они действительны только в рамках метода, в котором они определены.
Вы должны использовать класс Model, который вы определили ранее, и передать его вашему View. Нет ничего плохого в передаче класса Model, в котором определены не все поля.
Обновление :
Я думаю, что раньше был неправ. Это должно сработать. Возможно, проблема в View. Вы можете разместить больше кода? Особенно View и его конструктор.
Обновление второго:
Хорошо, я ошибался, передавая анонимный тип другому методу для использования в качестве динамической переменной - это можно сделать.
Но я также ошибался, полагая, что то, что вы пытаемся сделать бы работу. К сожалению для вас, этого не произойдет. Проблема в том, что вы используете ViewPage
, который использует внутри ViewDataDictionary
. Поскольку для них требуются строгие типы, вы не сможете использовать с ними динамические объекты. Внутренняя структура просто не использует динамическое внутренне, и определение динамического типа не работает.
Что потребуется, так это класс DynamicViewPage
и соответствующий класс DynamicViewDataDictionary
, которые принимают объект
и хранят его внутри как динамический. Затем вы можете использовать анонимный тип и передать его своим представлениям.
Тем не менее, вы ничего не получите. Вы можете указать свои представления, как вы это сделали (т.е. <% = Model.Name%>
), но строгая типизация не принесет вам пользы. Не было бы никакого intellisense и не было бы безопасности типов. Вы' d с тем же успехом может использовать нетипизированный ViewDataDictionary
, как предлагает @Dennis Palmer.
Это был интересный (и, к сожалению для меня, увлекательный) мысленный эксперимент, но я думаю, что в конечном итоге этого не произойдет. Либо объявите общедоступный тип и передайте его своим представлениям, либо используйте нетипизированный словарь.
Какую выгоду вы надеялись получить от использования здесь динамического типа?
Использование словаря ViewData - очень простой способ добавления произвольных объектов / элементов в вывод вашего представления.
Вам не нужно отражение, чтобы получить имена свойств в вашем представлении. Просто используйте ViewData.Keys
, чтобы получить коллекцию имен.
Изменить: Я только что узнал немного больше о динамике, и я думаю, что, возможно, вам нужно создать свой собственный класс динамических объектов который наследуется от DynamicObject . Вы захотите иметь частный словарь в этом классе, а затем переопределить TrySetMember
и TryGetMember
.
Отредактировать в сторону: Я думаю, что одно из преимуществ строго типизированной ViewModel - что вы можете принять его как параметр в ваших методах действия POST. Платформа MVC будет обрабатывать привязку модели, а в методе действия у вас просто будет экземпляр вашего класса ViewModel. Я не думаю, что у вас будет такое преимущество с динамическими, даже если они действительно работают.
Результат редактирования: Ну, я пробовал использовать класс, производный от DynamicObject, но VS2010 вылетает при попытке визуализировать представление . У меня нет никаких исключений, просто вылетает и Visual Studio перезагружается. Вот код, который я придумал и который вызывает сбой.
Пользовательский динамический класс:
public class DynViewModel : DynamicObject
{
private Dictionary<string, object> ViewDataBag;
public DynViewModel()
{
this.ViewDataBag = new Dictionary<string, object>();
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.ViewDataBag[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.ViewDataBag[binder.Name];
return true;
}
}
В контроллере:
public ActionResult DynamicView()
{
dynamic p = new DynamicViewModel.Models.DynViewModel();
p.Name = "Test";
p.Phone = "111-2222";
return View(p);
}
Мое мнение в основном такое же, как и в вопросе:
<p>Name: <%=Model.Name %></p>
<p>Phone: <%=Model.Phone %></p>
Мое заключение: Это может сработать, но в бета-версии 1 VS2010 я не могу понять, почему мой код вызывает сбой Visual Studio. Я' Я попробую это сделать еще раз в VS2010 Beta 2, когда он выйдет, потому что это интересное упражнение для изучения динамики. Однако, даже если бы это сработало, я все равно не вижу никаких преимуществ перед использованием словаря ViewData.
Фил Хаак спешит на помощь! Вот запись в блоге Фила Хаака, которая может вам помочь. Похоже, это то, что вы искали. Забава с отсутствующим методом и C # 4