Re: WCF и BLToolkit. Как мне удалось их скрестить.
От: Блудов Павел Россия  
Дата: 31.07.07 01:21
Оценка:
Здравствуйте, 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.