Здравствуйте, Shadowspan, Вы писали:
S>В класс AbstractClassBuilder, метод DefineNonAbstractType, в самый конец:
S>S> if(_context.Type.GetCustomAttributes(typeof (DataContractAttribute)).Length > 0)
S> _context.TypeBuilder.SetCustomAttribute(typeof(DataContractAttribute));
S>
Этот момент (и следующий) нужно обобщить. Можно реализовать что-то вроде
[BLToolkitExtensionAttribute(typeof(DataContractAttribute))]]
public abstract class Principal
{
public abstract long ID { get; set;}
public abstract string Name { get; set; }
public abstract bool IsGroup { get; set; }
[BLToolkitExtensionAttribute(typeof(SomeOtherAttribute), arg1, arg2)]]
public abstract bool Disabled { get; set; }
}
т.е. научить AbstractClassBuilder добавлять
какие-то аттрибуты прямо в генерируемые методы и свойства.
Можно сделать иначе. Например, завести у TypeBuilder'а соллекцию типов аттрибутов, которые он будет всегда копировать в атрибуты генерируемых мемберов.
Как-то так:
[DataContract]
public abstract class Principal
{
public abstract long ID { get; set;}
public abstract string Name { get; set; }
public abstract bool IsGroup { get; set; }
[SomeOther(arg1, arg2)]
public abstract bool Disabled { get; set; }
}
// ..
TypeFactory.DefineTransitAttribute(typeof(DataContractAttribute));
TypeFactory.DefineTransitAttribute(typeof(SomeOtherAttribute));
S>Далее создаем специальный аттрибут:
S>S> public class BLToolkitKnownTypeAttribute : Attribute, IOperationBehavior
S> {
S> private Type knownType;
S> public BLToolkitKnownTypeAttribute(Type type)
S> {
S> object obj = TypeAccessor.CreateInstanceEx(type);
S> knownType = obj.GetType();
S> }
S> }
S>
Это можно (и нужно) сделать проще:
public BLToolkitKnownTypeAttribute(Type type)
{
knownType = TypeAccessor.GetAccessor(type).Type;
}
... << RSDN@Home 1.2.0 alpha rev. 692>>