diff Source/TypeBuilder/GenerateAttributeAttribute.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/GenerateAttributeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,109 @@
+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);
+			}
+		}
+	}
+}
\ No newline at end of file