Здравствуйте, Ziaw, Вы писали:
Z>Я пока решил проблему сделав свою версию pnew. Но может быть это можно сделать прямо в new.
Поправь сам. Если будте что-то не так, то будем разбираться. На крайняк откатим.
Z>Кстати, лицензия позволяет использовать допиленные исходники библиотеки в своих проектах?
Все что публикцется в репозитории немерла идет под его лицензией. Так что можно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>Нельзя ли сделать их паблик? Возникают проблемы с передачей анонимных классов во вьюхи, т.к. те компилируются в рантайме в отдельную сборку.
Только если будешь делать, оставь опцию (и, желательно дефолт), чтобы они были приватными. Мне, к примеру, такие вещи не хочется выставлять из сборки напоказ
Кстати, я бы в таком случае пользовался IAnonymous (но у него, конечно, есть свои проблемы).
Здравствуйте, Ziaw, Вы писали:
Z>Ок, внеси меня в комитеры. Заодно исправлю макросы логгирования в режиме интелисенса, с ними пришлось поступить так же (засунул в рельсы).
Присылай гуглеый экаунт.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, catbert, Вы писали:
C>Только если будешь делать, оставь опцию (и, желательно дефолт), чтобы они были приватными. Мне, к примеру, такие вещи не хочется выставлять из сборки напоказ
Может как-то это дело декларативно задавать? Ну, скажем, если анонимный тип возрващается публичным методом публичного типа, то делаем его публичным.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
C>>Только если будешь делать, оставь опцию (и, желательно дефолт), чтобы они были приватными. Мне, к примеру, такие вещи не хочется выставлять из сборки напоказ
VD>Может как-то это дело декларативно задавать? Ну, скажем, если анонимный тип возрващается публичным методом публичного типа, то делаем его публичным.
Может атрибутом уровня сборки? AnonymousTypesVisibility(Internal(default)|Public|Private)
У меня он не возвращается никакими методами. Да и метод такой может быть создан разве что макросом.
Кстати, по хорошему этот макрос надо бы научить еще работать как object initializer. Несмотря на все прелести алг.типов и генерируемых конструкторов фича нужная. Кстати, как линк работает там где требется такой экспрешн? В тулките тоже многое на него завязано.
Здравствуйте, Ziaw, Вы писали:
Z>Может атрибутом уровня сборки? AnonymousTypesVisibility(Internal(default)|Public|Private)
Для каждого выражения нужно иметь возможность регулировать видимость автоматически. Но атрибут уровня сборки тоже хотелось бы иметь. Наверное, стоит newp добавить в стандартную библиотеку.
Но я, допустим, против общей видимости анонимных типов. В некоторых сценариях — типа твоего — они имеют смысл, но вообще они только портят API.
Z>Кстати, по хорошему этот макрос надо бы научить еще работать как object initializer.
Если это про C#-овску конструкцию new Foo { Height = 6; Name = "Bar" }, то я где-то видел (сейчас в интернете не могу найти) простенький макрос:
namespace WithTest {
// Object initializer syntax
// Foo() with { Bar = 42; Buz = "hello" }public macro @with (obj, assignmentExprs) {
def exprs = match (assignmentExprs) {
| PExpr.Sequence(elements) => elements;
| _ => throw Exception("'with' must be given a Sequence of assignment statements.");
};
def createTemp = <[ def temp = $obj ]>;
def assignments(xs) {
| <[ $(name : name) = $value ]> :: xs => <[ temp.$(name : name) = $value ]> :: assignments(xs);
| [] => [ <[ temp ]> ];
| _ => throw Exception("'with' must be given a Sequence of assignment statements.");
};
<[ { .. $( createTemp :: assignments(exprs) ) } ]>
}
}
Я думаю, встроить его в код макроса new не составит проблемы.
Здравствуйте, Ziaw, Вы писали:
Z>Может атрибутом уровня сборки? AnonymousTypesVisibility(Internal(default)|Public|Private)
Z>У меня он не возвращается никакими методами. Да и метод такой может быть создан разве что макросом.
Химия какая-то получается .
Z>Кстати, по хорошему этот макрос надо бы научить еще работать как object initializer. Несмотря на все прелести алг.типов и генерируемых конструкторов фича нужная.
Лучше сделать ее отдельно. Тут уже предлагали макру with похожую на бэйсиковскую фичу.
Z>Кстати, как линк работает там где требется такой экспрешн? В тулките тоже многое на него завязано.
Используются кортежи. Для них делается сопоставление параметров коструктора полям.
Анонимных типов в момент реализации линка не было, так что не знач будут ли они работать вместе с линком (через эспрешон-три), но это не долго "докрутить". Короче, как начнете плотно с SQL-ем работать, то доведем до готовности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>Нельзя ли сделать их паблик? Возникают проблемы с передачей анонимных классов во вьюхи, т.к. те компилируются в рантайме в отдельную сборку.
Здравствуйте, hardcase, Вы писали:
Z>>Нельзя ли сделать их паблик? Возникают проблемы с передачей анонимных классов во вьюхи, т.к. те компилируются в рантайме в отдельную сборку.
H>А как ты хочешь его именовать?
Твоим макросом, он же выводит типы в модели. В том числе и анонимные.
Здравствуйте, VladD2, Вы писали:
VD>Химия какая-то получается .
Ага, химия. В контроллере пишется такой код:
public Index() : ActionResult
{
using (def db = Db())
{
def message = $"NRails env: '$(db.Env)'. We have $(db.Persons.Count()) persons."def taxonomies = db.Doctors.Select(d => new (tax = d.Taxonomy, id = d.PersionId).ToList();
model ( message = message, taxonomies = taxonomies )
}
}
А во вьюхе доступна model, в которой есть message : string, и taxonomies c труднопроизносимым типом.
Это одна из ключевых фич nrails. Больше всего в MVC напрягает создание типа для ViewModel на каждую вью. Потом начинает казаться, что пара вьюх могут использовать один и тот же тип, а рано или поздно приходят требования которые заставляют их различать. Вобщем геморой еще тот.
А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.
Впрочем этот механизм вместе с константами требует более тщательной обкатки и скорее всего будет перепроектирован после опытного использования.
Здравствуйте, Ziaw, Вы писали:
Z>А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.
Кажется я понял что за проблема. Анонимный класс new () сейчас имеет модификатор internal а когда он появляется в model(), то публичное поле получает этот тип с модификатором internal. Надо подумать.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Ziaw, Вы писали:
Z>>А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.
H>Кажется я понял что за проблема. Анонимный класс new () сейчас имеет модификатор internal а когда он появляется в model(), то публичное поле получает этот тип с модификатором internal. Надо подумать.
Спасибо =) Я уже разбрался в проблеме, тип просто не виден в сборке вьюхи. Изначальный пост именно об этом. Думаю для начала сделать атрибут для установки области видимости анонимных классов.
А вообще, надо подумать, возможно анонимных типов будет достаточно для всего и макросу модель не придется генерить свой аналог. У меня пока не получается придумать красивый дизайн совмещения автосгенеренных методов указания вьюх и передачи им параметров. Почему-то все сводится к задаче генерации макросов
Здравствуйте, Ziaw, Вы писали:
Z>Спасибо =) Я уже разбрался в проблеме, тип просто не виден в сборке вьюхи. Изначальный пост именно об этом. Думаю для начала сделать атрибут для установки области видимости анонимных классов.
В принципе добавить мета-атрибут настройки видимости анонимных классов вне сборки.
Здравствуйте, Ziaw, Вы писали:
Z>Спасибо =) Я уже разбрался в проблеме, тип просто не виден в сборке вьюхи. Изначальный пост именно об этом. Думаю для начала сделать атрибут для установки области видимости анонимных классов.
Здравствуйте, Ziaw, Вы писали:
Z>А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.
ОК. Предположим экспортировали мы анонимные типы из сборки. А что делать в той сборке в которую они подключаются, если в ней так же используются такие же анонимные типы? Ведь будет же конфликт имен.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Ziaw, Вы писали:
Z>>А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.
VD>ОК. Предположим экспортировали мы анонимные типы из сборки. А что делать в той сборке в которую они подключаются, если в ней так же используются такие же анонимные типы? Ведь будет же конфликт имен.
Сейчас если анонимный класс есть — будет использоваться он (т.е. внешний). Защиту от этой неприятной ситуации я добавлю чуть позже