Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.TypeBuilder.GenerateAttributeAttribute.cs

 
using System;

namespace BLToolkit.TypeBuilder
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
    public class GenerateAttributeAttribute: Builders.AbstractTypeBuilderAttribute
    {
        public GenerateAttributeAttribute(Type attributeType)
        {
            _attributeType = attributeType;
        }

        public GenerateAttributeAttribute(Type attributeType, params object[] arguments)
        {
            _attributeType = attributeType;
            _arguments     = arguments;
        }

        private readonly Type _attributeType;
        public           Type  AttributeType
        {
            get { return _attributeType; }
        }

        private readonly object[] _arguments;
        public           object[]  Arguments
        {
            get { return _arguments; }
        }

        private string[] _namedArgumentNames;
        public  string[]  NamedArgumentNames
        {
            get { return _namedArgumentNames;  }
            set { _namedArgumentNames = value; }
        }

        private object[] _namedArgumentValues;
        public  object[]  NamedArgumentValues
        {
            get { return _namedArgumentValues;  }
            set { _namedArgumentValues = value; }
        }

        public object this[string name]
        {
            get
            {
                if (_namedArgumentNames == null)
                    return null;

                int idx = Array.IndexOf(_namedArgumentNames, name);

                return idx < 0? null: _namedArgumentValues[idx];
            }
            set
            {
                if (_namedArgumentNames == null)
                {
                    _namedArgumentNames  = new string[]{ name  };
                    _namedArgumentValues = new object[]{ value };
                    return;
                }

                int idx = Array.IndexOf(_namedArgumentNames, name);
                if (idx < 0)
                {
                    idx = _namedArgumentNames.Length;

                    Array.Resize(ref _namedArgumentNames,  idx + 1);
                    Array.Resize(ref _namedArgumentValues, idx + 1);

                    _namedArgumentNames [idx] = name;
                    _namedArgumentValues[idx] = value;
                }
                else
                {
                    _namedArgumentValues[idx] = value;
                }
            }
        }

        public T GetValue<T>(string name)
        {
            object value = this[name];
            return value == null? default(T): (T)value;
        }

        public T GetValue<T>(string name, T defaultValue)
        {
            return _namedArgumentNames == null || Array.IndexOf(_namedArgumentNames, name) < 0?
                defaultValue : GetValue<T>(name);
        }

        public void SetValue<T>(string name, T value)
        {
            this[name] = value;
        }

        public override Builders.IAbstractTypeBuilder  TypeBuilder
        {
            get
            {
                return new Builders.GeneratedAttributeBuilder(
                    _attributeType, _arguments, _namedArgumentNames, _namedArgumentValues);
            }
        }
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net