Mercurial > pub > bltoolkit
diff Source/TypeBuilder/InstanceTypeAttribute.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/InstanceTypeAttribute.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,180 @@ +using System; +using System.Diagnostics.CodeAnalysis; + +using BLToolkit.Reflection; + +namespace BLToolkit.TypeBuilder +{ + ///<summary> + /// Specifies a value holder type. + ///</summary> + [SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")] + [AttributeUsage(AttributeTargets.Property)] + public class InstanceTypeAttribute : Builders.AbstractTypeBuilderAttribute + { + ///<summary> + /// Initializes a new instance of the InstanceTypeAttribute class. + ///</summary> + ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param> + public InstanceTypeAttribute(Type instanceType) + { + _instanceType = instanceType; + } + + ///<summary> + /// Initializes a new instance of the InstanceTypeAttribute class. + ///</summary> + ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param> + ///<param name="parameter1">An additional parameter.</param> + ///<seealso cref="Parameters"/> + public InstanceTypeAttribute(Type instanceType, object parameter1) + { + _instanceType = instanceType; + SetParameters(parameter1); + } + + ///<summary> + /// Initializes a new instance of the InstanceTypeAttribute class. + ///</summary> + ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param> + ///<param name="parameter1">An additional parameter.</param> + ///<param name="parameter2">An additional parameter.</param> + ///<seealso cref="Parameters"/> + public InstanceTypeAttribute(Type instanceType, + object parameter1, + object parameter2) + { + _instanceType = instanceType; + SetParameters(parameter1, parameter2); + } + + ///<summary> + /// Initializes a new instance of the InstanceTypeAttribute class. + ///</summary> + ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param> + ///<param name="parameter1">An additional parameter.</param> + ///<param name="parameter2">An additional parameter.</param> + ///<param name="parameter3">An additional parameter.</param> + ///<seealso cref="Parameters"/> + public InstanceTypeAttribute(Type instanceType, + object parameter1, + object parameter2, + object parameter3) + { + _instanceType = instanceType; + SetParameters(parameter1, parameter2, parameter3); + } + + ///<summary> + /// Initializes a new instance of the InstanceTypeAttribute class. + ///</summary> + ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param> + ///<param name="parameter1">An additional parameter.</param> + ///<param name="parameter2">An additional parameter.</param> + ///<param name="parameter3">An additional parameter.</param> + ///<param name="parameter4">An additional parameter.</param> + ///<seealso cref="Parameters"/> + public InstanceTypeAttribute(Type instanceType, + object parameter1, + object parameter2, + object parameter3, + object parameter4) + { + _instanceType = instanceType; + SetParameters(parameter1, parameter2, parameter3, parameter4); + } + + ///<summary> + /// Initializes a new instance of the InstanceTypeAttribute class. + ///</summary> + ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param> + ///<param name="parameter1">An additional parameter.</param> + ///<param name="parameter2">An additional parameter.</param> + ///<param name="parameter3">An additional parameter.</param> + ///<param name="parameter4">An additional parameter.</param> + ///<param name="parameter5">An additional parameter.</param> + ///<seealso cref="Parameters"/> + public InstanceTypeAttribute(Type instanceType, + object parameter1, + object parameter2, + object parameter3, + object parameter4, + object parameter5) + { + _instanceType = instanceType; + SetParameters(parameter1, parameter2, parameter3, parameter4, parameter5); + } + + ///<summary> + /// Initializes a new instance of the InstanceTypeAttribute class. + ///</summary> + ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param> + ///<param name="parameter1">An additional parameter.</param> + ///<param name="parameters">More additional parameters.</param> + ///<seealso cref="Parameters"/> + public InstanceTypeAttribute(Type instanceType, object parameter1, params object[] parameters) + { + _instanceType = instanceType; + + // Note: we can not use something like + // public InstanceTypeAttribute(Type instanceType, params object[] parameters) + // because [InstanceType(typeof(Foo), new object[] {1,2,3})] will be treated as + // [InstanceType(typeof(Foo), 1, 2, 3)] so it will be not possible to specify + // an instance type with array as the type of the one and only parameter. + // An extra parameter of type object made it successul. + + int len = parameters.Length; + Array.Resize(ref parameters, len + 1); + Array.ConstrainedCopy(parameters, 0, parameters, 1, len); + parameters[0] = parameter1; + + SetParameters(parameters); + } + + protected void SetParameters(params object[] parameters) + { + _parameters = parameters; + } + + private object[] _parameters; + ///<summary> + /// Any additional parameters passed to a value holder constructor + /// with <see cref="InitContext"/> parameter. + ///</summary> + public object[] Parameters + { + get { return _parameters; } + } + + private readonly Type _instanceType; + protected Type InstanceType + { + get { return _instanceType; } + } + + private bool _isObjectHolder; + ///<summary> + /// False (default value) for holders for scalar types, + /// true for holders for complex objects. + ///</summary> + public bool IsObjectHolder + { + get { return _isObjectHolder; } + set { _isObjectHolder = value; } + } + + private Builders.IAbstractTypeBuilder _typeBuilder; + ///<summary> + /// An <see cref="Builders.IAbstractTypeBuilder"/> required for this attribute + /// to build an abstract type inheritor. + ///</summary> + public override Builders.IAbstractTypeBuilder TypeBuilder + { + get + { + return _typeBuilder ?? (_typeBuilder = + new Builders.InstanceTypeBuilder(_instanceType, _isObjectHolder)); + } + } + } +}