File: AuthoringOM\Serializer\ExtendedPropertyInfo.cs
Project: ndp\cdf\src\WF\Common\System.Workflow.ComponentModel.csproj (System.Workflow.ComponentModel)
namespace System.Workflow.ComponentModel.Serialization
{
    using System;
    using System.IO;
    using System.CodeDom;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.ComponentModel.Design.Serialization;
    using System.Collections;
    using System.Xml;
    using System.Xml.Serialization;
    using System.Reflection;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Text;
    using System.Globalization;
    using System.Workflow.ComponentModel.Compiler;
    using System.Workflow.ComponentModel.Design;
    using System.Runtime.Serialization;
    using System.Security.Permissions;
    using System.Collections.ObjectModel;
    using System.Drawing;
 
 
 
    #region X:Key Support
    internal delegate object GetValueHandler(ExtendedPropertyInfo extendedProperty, object extendee);
    internal delegate void SetValueHandler(ExtendedPropertyInfo extendedProperty, object extendee, object value);
    internal delegate XmlQualifiedName GetQualifiedNameHandler(ExtendedPropertyInfo extendedProperty, WorkflowMarkupSerializationManager manager, out string prefix);
 
    #region Class ExtendedPropertyInfo
    internal sealed class ExtendedPropertyInfo : PropertyInfo
    {
        #region Members and Constructors
        private PropertyInfo realPropertyInfo = null;
        private GetValueHandler OnGetValue;
        private SetValueHandler OnSetValue;
        private GetQualifiedNameHandler OnGetXmlQualifiedName;
        private WorkflowMarkupSerializationManager manager = null;
 
        internal ExtendedPropertyInfo(PropertyInfo propertyInfo, GetValueHandler getValueHandler, SetValueHandler setValueHandler, GetQualifiedNameHandler qualifiedNameHandler)
        {
            this.realPropertyInfo = propertyInfo;
            this.OnGetValue = getValueHandler;
            this.OnSetValue = setValueHandler;
            this.OnGetXmlQualifiedName = qualifiedNameHandler;
        }
 
        internal ExtendedPropertyInfo(PropertyInfo propertyInfo, GetValueHandler getValueHandler, SetValueHandler setValueHandler, GetQualifiedNameHandler qualifiedNameHandler, WorkflowMarkupSerializationManager manager)
            : this(propertyInfo, getValueHandler, setValueHandler, qualifiedNameHandler)
        {
            this.manager = manager;
        }
 
        internal PropertyInfo RealPropertyInfo
        {
            get
            {
                return this.realPropertyInfo;
            }
        }
 
        internal WorkflowMarkupSerializationManager SerializationManager
        {
            get
            {
                return this.manager;
            }
        }
        #endregion
 
        #region Property Info overrides
        public override string Name
        {
            get
            {
                return this.realPropertyInfo.Name;
            }
        }
 
        public override Type DeclaringType
        {
            get
            {
                return this.realPropertyInfo.DeclaringType;
            }
        }
 
        public override Type ReflectedType
        {
            get
            {
                return this.realPropertyInfo.ReflectedType;
            }
        }
 
        public override Type PropertyType
        {
            get
            {
                return this.realPropertyInfo.PropertyType;
            }
        }
 
        public override MethodInfo[] GetAccessors(bool nonPublic)
        {
            return this.realPropertyInfo.GetAccessors(nonPublic);
        }
 
        public override MethodInfo GetGetMethod(bool nonPublic)
        {
            return this.realPropertyInfo.GetGetMethod(nonPublic);
        }
 
        public override MethodInfo GetSetMethod(bool nonPublic)
        {
            return this.realPropertyInfo.GetSetMethod(nonPublic);
        }
 
        public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)
        {
            if (OnGetValue != null)
                return OnGetValue(this, obj);
            else
                return null;
        }
 
        public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)
        {
            if (OnSetValue != null)
                OnSetValue(this, obj, value);
        }
 
        public XmlQualifiedName GetXmlQualifiedName(WorkflowMarkupSerializationManager manager, out string prefix)
        {
            prefix = String.Empty;
            if (OnGetXmlQualifiedName != null)
                return OnGetXmlQualifiedName(this, manager, out prefix);
            else
                return null;
        }
 
        public override ParameterInfo[] GetIndexParameters()
        {
            return this.realPropertyInfo.GetIndexParameters();
        }
 
        public override PropertyAttributes Attributes
        {
            get
            {
                return this.realPropertyInfo.Attributes;
            }
        }
 
        public override bool CanRead
        {
            get
            {
                return this.realPropertyInfo.CanRead;
            }
        }
 
        public override bool CanWrite
        {
            get
            {
                return this.realPropertyInfo.CanWrite;
            }
        }
        #endregion
 
        #region MemberInfo Overrides
        public override object[] GetCustomAttributes(bool inherit)
        {
            return this.realPropertyInfo.GetCustomAttributes(inherit);
        }
 
        public override object[] GetCustomAttributes(Type attributeType, bool inherit)
        {
            return this.realPropertyInfo.GetCustomAttributes(attributeType, inherit);
        }
 
        public override bool IsDefined(Type attributeType, bool inherit)
        {
            return this.realPropertyInfo.IsDefined(attributeType, inherit);
        }
        #endregion
 
        #region  Helpers
        internal static bool IsExtendedProperty(WorkflowMarkupSerializationManager manager, XmlQualifiedName xmlQualifiedName)
        {
            bool isExtendedProperty = false;
            object extendee = manager.Context.Current;
            if (extendee != null)
            {
                foreach (ExtendedPropertyInfo extendedProperty in manager.GetExtendedProperties(extendee))
                {
                    string prefix = String.Empty;
                    XmlQualifiedName qualifiedPropertyName = extendedProperty.GetXmlQualifiedName(manager, out prefix);
                    if (qualifiedPropertyName.Name.Equals(xmlQualifiedName.Name, StringComparison.Ordinal)
                        && qualifiedPropertyName.Namespace.Equals(xmlQualifiedName.Namespace, StringComparison.Ordinal))
                    {
                        isExtendedProperty = true;
                        break;
                    }
                }
            }
 
            return isExtendedProperty;
        }
        internal static bool IsExtendedProperty(WorkflowMarkupSerializationManager manager, IList<PropertyInfo> propInfos, XmlQualifiedName xmlQualifiedName)
        {
            foreach (PropertyInfo propInfo in propInfos)
            {
                ExtendedPropertyInfo extendedProperty = propInfo as ExtendedPropertyInfo;
                if (extendedProperty == null)
                    continue;
 
                string prefix = String.Empty;
                XmlQualifiedName qualifiedPropertyName = extendedProperty.GetXmlQualifiedName(manager, out prefix);
                if (qualifiedPropertyName.Name.Equals(xmlQualifiedName.Name, StringComparison.Ordinal)
                    && qualifiedPropertyName.Namespace.Equals(xmlQualifiedName.Namespace, StringComparison.Ordinal))
                {
                    return true;
                }
            }
 
            return false;
        }
        #endregion
    }
    #endregion
 
    #endregion
}