using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.Design;
using System.ComponentModel;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
namespace Csla.Web.Design
{
///
/// Contains schema information for a single
/// object property.
///
[Serializable]
public class ObjectFieldInfo : IDataSourceFieldSchema
{
private Type _dataType;
private bool _primaryKey;
private bool _isIdentity;
private bool _isNullable;
private int _length;
private bool _isReadOnly;
private string _name;
private bool _nullable;
///
/// Creates an instance of the object.
///
/// The PropertyInfo object
/// describing the property.
public ObjectFieldInfo(PropertyDescriptor field)
{
DataObjectFieldAttribute attribute =
(DataObjectFieldAttribute)
field.Attributes[typeof(DataObjectFieldAttribute)];
if (attribute != null)
{
_primaryKey = attribute.PrimaryKey;
_isIdentity = attribute.IsIdentity;
_isNullable = attribute.IsNullable;
_length = attribute.Length;
}
_dataType = Utilities.GetPropertyType(
field.PropertyType);
_isReadOnly = field.IsReadOnly;
_name = field.Name;
// nullable
Type t = field.PropertyType;
if (!t.IsValueType || _isNullable)
_nullable = true;
else
{
if (t.IsGenericType)
_nullable = (t.GetGenericTypeDefinition() == typeof(Nullable<>));
else
_nullable = false;
}
}
///
/// Gets the data type of the property.
///
public Type DataType
{
get
{
return _dataType;
}
}
///
/// Gets a value indicating whether this property
/// is an identity key for the object.
///
///
/// Returns the optional value provided through
/// the DataObjectField
/// attribute on the property.
///
public bool Identity
{
get { return _isIdentity; }
}
///
/// Gets a value indicating whether this property
/// is readonly.
///
public bool IsReadOnly
{
get { return _isReadOnly; }
}
///
/// Gets a value indicating whether this property
/// must contain a unique value.
///
///
/// Always returns True if the property
/// is marked as a primary key, otherwise
/// returns False.
///
public bool IsUnique
{
get { return _primaryKey; }
}
///
/// Gets the length of the property value.
///
///
/// Returns the optional value provided through
/// the DataObjectField
/// attribute on the property.
///
public int Length
{
get { return _length; }
}
///
/// Gets the property name.
///
public string Name
{
get { return _name; }
}
///
/// Gets a value indicating whether the property
/// is nullable
///
///
/// Returns True for reference types, and for
/// value types wrapped in the Nullable generic.
/// The result can also be set to True through
/// the DataObjectField
/// attribute on the property.
///
public bool Nullable
{
get
{ return _nullable; }
}
///
/// Gets the property's numeric precision.
///
/// Always returns -1.
public int Precision
{
get { return -1; }
}
///
/// Gets a value indicating whether the property
/// is a primary key value.
///
///
/// Returns the optional value provided through
/// the DataObjectField
/// attribute on the property.
///
public bool PrimaryKey
{
get { return _primaryKey; }
}
///
/// Gets the property's scale.
///
/// Always returns -1.
public int Scale
{
get { return -1; }
}
}
}