using System;
using System.Diagnostics.CodeAnalysis;
using BLToolkit.Reflection;
namespace BLToolkit.TypeBuilder
{
///
/// Specifies a value holder type.
///
[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
[AttributeUsage(AttributeTargets.Property)]
public class InstanceTypeAttribute : Builders.AbstractTypeBuilderAttribute
{
///
/// Initializes a new instance of the InstanceTypeAttribute class.
///
///The of an instance.
public InstanceTypeAttribute(Type instanceType)
{
_instanceType = instanceType;
}
///
/// Initializes a new instance of the InstanceTypeAttribute class.
///
///The of an instance.
///An additional parameter.
///
public InstanceTypeAttribute(Type instanceType, object parameter1)
{
_instanceType = instanceType;
SetParameters(parameter1);
}
///
/// Initializes a new instance of the InstanceTypeAttribute class.
///
///The of an instance.
///An additional parameter.
///An additional parameter.
///
public InstanceTypeAttribute(Type instanceType,
object parameter1,
object parameter2)
{
_instanceType = instanceType;
SetParameters(parameter1, parameter2);
}
///
/// Initializes a new instance of the InstanceTypeAttribute class.
///
///The of an instance.
///An additional parameter.
///An additional parameter.
///An additional parameter.
///
public InstanceTypeAttribute(Type instanceType,
object parameter1,
object parameter2,
object parameter3)
{
_instanceType = instanceType;
SetParameters(parameter1, parameter2, parameter3);
}
///
/// Initializes a new instance of the InstanceTypeAttribute class.
///
///The of an instance.
///An additional parameter.
///An additional parameter.
///An additional parameter.
///An additional parameter.
///
public InstanceTypeAttribute(Type instanceType,
object parameter1,
object parameter2,
object parameter3,
object parameter4)
{
_instanceType = instanceType;
SetParameters(parameter1, parameter2, parameter3, parameter4);
}
///
/// Initializes a new instance of the InstanceTypeAttribute class.
///
///The of an instance.
///An additional parameter.
///An additional parameter.
///An additional parameter.
///An additional parameter.
///An additional parameter.
///
public InstanceTypeAttribute(Type instanceType,
object parameter1,
object parameter2,
object parameter3,
object parameter4,
object parameter5)
{
_instanceType = instanceType;
SetParameters(parameter1, parameter2, parameter3, parameter4, parameter5);
}
///
/// Initializes a new instance of the InstanceTypeAttribute class.
///
///The of an instance.
///An additional parameter.
///More additional 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;
///
/// Any additional parameters passed to a value holder constructor
/// with parameter.
///
public object[] Parameters
{
get { return _parameters; }
}
private readonly Type _instanceType;
protected Type InstanceType
{
get { return _instanceType; }
}
private bool _isObjectHolder;
///
/// False (default value) for holders for scalar types,
/// true for holders for complex objects.
///
public bool IsObjectHolder
{
get { return _isObjectHolder; }
set { _isObjectHolder = value; }
}
private Builders.IAbstractTypeBuilder _typeBuilder;
///
/// An required for this attribute
/// to build an abstract type inheritor.
///
public override Builders.IAbstractTypeBuilder TypeBuilder
{
get
{
return _typeBuilder ?? (_typeBuilder =
new Builders.InstanceTypeBuilder(_instanceType, _isObjectHolder));
}
}
}
}