Отвечу сам себе: в пункте 2 есть хорошие такие подводные камни, по каким-то непонятным пока мне причинам в определенных случаях в рантайме получается так:
Дано:
public abstract Class1 : EditableObject<Class1>
{
private Class3 _C3 = Class3.CreateInstance();
public Class3 C3
{
get
{
return _C3;
} set
{
_C3 = value;
}
}
}
public abstarct Class2 : EditableObject<Class2>
{
public string SomeProperty { get; set; }
}
public abstarct Class3 : EditableObject<Class3>
{
public string SomeProperty { get; set; }
}
public abstract Class1Class2Link : EditableObject<Class1Class2Link>
{
private Class1 _C1 = Class1.CreateInstance();
public Class1 C1
{
get
{
return _C1;
}
set
{
_C1 = value;
}
}
private Class2 _C2 = Class2.CreateInstance();
public Class2 C2
{
get
{
return _C2;
}
set
{
_C2 = value;
}
}
public SomeLinkProperty { get; set; }
}
В рантайме, не разобрался пока почему, происходит следующий вызов:
BLToolkitExtension.Class1$TypeAccessor.Accessor$C3.GetValue(object); // object.GetType() = typeof(Class1Class2Link)
И естественно генерится InvalidCastException.