Здравствуйте, albenik, Вы писали:
A>За подсказку про атрибуты спасибо, [NoInstance] спасает и в дизайнере тоже.
да не вопрос, обращайтесь

ток с
NoInstance надо оккуратней, у вас в св-ве будет null пока вы его руками не присвоите, и тут есть камень:
public abstract class Parent
{
public abstract int Id { get; set; }
}
[MapField("ParentId", "Parent.Id")]
public abstract class Child
{
[NoInstance]
public abstract Parent Parent { get; set; }
}
[Test]
public void FailTest()
{
using (DbManager db = new DbManager())
{
Child c = db.SetCommand("SELECT 1 AS ParentId").ExecuteObject<Child>();
Assert.IsNotNull(c.Parent); // FAILS
}
}
[Test]
public void SuccessTest()
{
using (DbManager db = new DbManager())
{
Child c = TypeAccessor.CreateInstance<Child>();
c.Parent = TypeAccessor.CreateInstance<Parent>();
db.SetCommand("SELECT 1 AS ParentId").ExecuteObject<Child>(c);
Assert.IsNotNull(c.Parent); // OK
Assert.AreEqual(1, c.Parent.Id); // OK
}
}
A>Другой вопрос, что выпадение студии по мне слишком жесткая реакция даже на криворукость, как, впрочем и переполнение стека из-за неявной рекурсии в реалтайме.
A>По идее в кодогенераторе вполне можно проверять что тип поля такой же как содержащего это поле класса и в getter поля вместо вызова CreateInstanse вставлять Exception типа "Warning possible recurisve call".
A>Так хоть сразу понятно будет где ошибка.
не вариант, тогда вообще подобные струкуры не сделать, а это бывает переодически нужно. вообще подобные вещи очень быстро выявляются, и раз напоровшись, увидев знакомые симптомы проблему решаешь в лет