VS2008 валится при data binding+ObjectBinder+EditableObject
От: albenik Россия  
Дата: 14.06.09 08:04
Оценка:
Дано:

public abstract class A : EditableObject<A>
{
    public abstract B LinkedB { get; set; }
    public abstract string Name { get; set; }
}

public abstract class B : EditableObject<B>
{
    public abstract B LinkedB { get; set; }
    public abstract string Name { get; set; }
}


потом на форму кидаем ObjectBinder и выбираем в качестве ItemType, класс A
затем на форму кидаем любой контрол, например TextBox, и пытаемся забиндить в дизайнере что угодно на любое его поле.

В результате VS тупо валится с ошибкой.
"Сбойное приложение devenv.exe, версия 9.0.30729.1, штамп времени 0x488f2b50, сбойный модуль kernel32.dll, версия 6.0.6001.18215, штамп времени 0x49953395, код исключения 0xe053534f, смещение ошибки 0x000442eb, ИД процесса 0x10a8, время запуска приложения 0x01c9ecc4b1ce54e1."
".NET Runtime version 2.0.50727.3074 — Неисправимая ошибка в модуле исполнения (6FC11132) (0)"
Re: VS2008 валится при data binding+ObjectBinder+EditableObj
От: ili Россия  
Дата: 15.06.09 05:10
Оценка:
Здравствуйте, albenik, Вы писали:

A>Дано:


A>
A>public abstract class A : EditableObject<A>
A>{
A>    public abstract B LinkedB { get; set; }
A>    public abstract string Name { get; set; }
A>}

A>public abstract class B : EditableObject<B>
A>{
A>    public abstract B LinkedB { get; set; }
A>    public abstract string Name { get; set; }
A>}
A>


у вас бесконечная рекурсия в B - внутри каждого B есть еще один B - в результате стек ется при проходке по этому делу.
CreateInstance тоже сдохнет теми же симптомами, но от этого еще можно спастись повесив аттрибут LazyInstance или NoInstance на LinkedB
а вот с обджект маппером...
Re[2]: VS2008 валится при data binding+ObjectBinder+Editable
От: albenik Россия  
Дата: 15.06.09 07:33
Оценка:
Здравствуйте, ili, Вы писали:

ili>Здравствуйте, albenik, Вы писали:


A>>Дано:


A>>
A>>public abstract class A : EditableObject<A>
A>>{
A>>    public abstract B LinkedB { get; set; }
A>>    public abstract string Name { get; set; }
A>>}

A>>public abstract class B : EditableObject<B>
A>>{
A>>    public abstract B LinkedB { get; set; }
A>>    public abstract string Name { get; set; }
A>>}
A>>


ili>у вас бесконечная рекурсия в B - внутри каждого B есть еще один B - в результате стек ется при проходке по этому делу.

ili>CreateInstance тоже сдохнет теми же симптомами, но от этого еще можно спастись повесив аттрибут LazyInstance или NoInstance на LinkedB
ili>а вот с обджект маппером...

Про рекурсию это я понял, и по большому счету, именно такая структура классов мне и не нужна, т.е. я вполне могу обойтись, да и обошелся уже без поля B.LinkedB
За подсказку про атрибуты спасибо, [NoInstance] спасает и в дизайнере тоже.

Другой вопрос, что выпадение студии по мне слишком жесткая реакция даже на криворукость, как, впрочем и переполнение стека из-за неявной рекурсии в реалтайме.
По идее в кодогенераторе вполне можно проверять что тип поля такой же как содержащего это поле класса и в getter поля вместо вызова CreateInstanse вставлять Exception типа "Warning possible recurisve call".
Так хоть сразу понятно будет где ошибка.
Re[3]: VS2008 валится при data binding+ObjectBinder+Editable
От: ili Россия  
Дата: 15.06.09 08:17
Оценка:
Здравствуйте, 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>Так хоть сразу понятно будет где ошибка.

не вариант, тогда вообще подобные струкуры не сделать, а это бывает переодически нужно. вообще подобные вещи очень быстро выявляются, и раз напоровшись, увидев знакомые симптомы проблему решаешь в лет
Re[4]: VS2008 валится при data binding+ObjectBinder+Editable
От: albenik Россия  
Дата: 15.06.09 09:33
Оценка:
Здравствуйте, ili, Вы писали:

ili>Здравствуйте, albenik, Вы писали:


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


ili>да не вопрос, обращайтесь

ili>ток с NoInstance надо оккуратней, у вас в св-ве будет null пока вы его руками не присвоите, и тут есть камень...
Ага, спасибо, я по нему уже прошелся


A>>Другой вопрос, что выпадение студии по мне слишком жесткая реакция даже на криворукость, как, впрочем и переполнение стека из-за неявной рекурсии в реалтайме.

A>>По идее в кодогенераторе вполне можно проверять что тип поля такой же как содержащего это поле класса и в getter поля вместо вызова CreateInstanse вставлять Exception типа "Warning possible recurisve call".
A>>Так хоть сразу понятно будет где ошибка.

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

Согласен, опыт решает.
Но почему такие структуры не делать не понимаю.
Банально: нет атрибута NoInstance генерирует getter c Exception, т.к., один фиг, в итоге бесконечная рекурсия, есть атрибут, все генерируется как и раньше.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.