2016-08-03 10:59:49 +00:00
namespace System.Workflow.ComponentModel.Design
{
using System ;
using System.IO ;
using System.Xml ;
using System.Reflection ;
using System.Collections ;
using System.Globalization ;
using System.ComponentModel ;
using System.Collections.Generic ;
using System.ComponentModel.Design ;
using System.Runtime.Serialization ;
using System.Workflow.ComponentModel.Compiler ;
using System.ComponentModel.Design.Serialization ;
using System.Workflow.ComponentModel.Serialization ;
using System.Runtime.Serialization.Formatters.Binary ;
using System.Diagnostics.CodeAnalysis ;
internal class XomlComponentSerializationService : ComponentSerializationService
{
private IServiceProvider serviceProvider = null ;
internal XomlComponentSerializationService ( IServiceProvider serviceProvider )
{
this . serviceProvider = serviceProvider ;
}
public override SerializationStore CreateStore ( )
{
return new WorkflowMarkupSerializationStore ( this . serviceProvider ) ;
}
public override SerializationStore LoadStore ( Stream stream )
{
if ( stream = = null ) throw new ArgumentNullException ( "stream" ) ;
BinaryFormatter f = new BinaryFormatter ( ) ;
return ( WorkflowMarkupSerializationStore ) f . Deserialize ( stream ) ;
}
// error CS0534: 'System.Workflow.ComponentModel.Design.XomlComponentSerializationService' does not implement inherited abstract member 'System.ComponentModel.Design.Serialization.ComponentSerializationService.SerializeAbsolute(System.ComponentModel.Design.Serialization.SerializationStore, object)'
public override void SerializeAbsolute ( SerializationStore store , object value )
{
this . Serialize ( store , value ) ;
}
public override void Serialize ( SerializationStore store , object value )
{
if ( store = = null ) throw new ArgumentNullException ( "store" ) ;
if ( value = = null ) throw new ArgumentNullException ( "value" ) ;
WorkflowMarkupSerializationStore xomlStore = store as WorkflowMarkupSerializationStore ;
if ( xomlStore = = null ) throw new InvalidOperationException ( SR . GetString ( SR . Error_UnknownSerializationStore ) ) ;
xomlStore . AddObject ( value ) ;
}
//error CS0534: 'System.Workflow.ComponentModel.Design.XomlComponentSerializationService' does not implement inherited abstract member 'System.ComponentModel.Design.Serialization.ComponentSerializationService.SerializeMemberAbsolute(System.ComponentModel.Design.Serialization.SerializationStore, object, System.ComponentModel.MemberDescriptor)'
public override void SerializeMemberAbsolute ( SerializationStore store , object owningObject , MemberDescriptor member )
{
this . SerializeMember ( store , owningObject , member ) ;
}
public override void SerializeMember ( SerializationStore store , object owningObject , MemberDescriptor member )
{
if ( store = = null ) throw new ArgumentNullException ( "store" ) ;
if ( owningObject = = null ) throw new ArgumentNullException ( "owningObject" ) ;
if ( member = = null ) throw new ArgumentNullException ( "member" ) ;
WorkflowMarkupSerializationStore xomlStore = store as WorkflowMarkupSerializationStore ;
if ( xomlStore = = null ) throw new InvalidOperationException ( SR . GetString ( SR . Error_UnknownSerializationStore ) ) ;
xomlStore . AddMember ( owningObject , member ) ;
}
public override ICollection Deserialize ( SerializationStore store )
{
if ( store = = null ) throw new ArgumentNullException ( "store" ) ;
WorkflowMarkupSerializationStore xomlStore = store as WorkflowMarkupSerializationStore ;
if ( xomlStore = = null ) throw new InvalidOperationException ( SR . GetString ( SR . Error_UnknownSerializationStore ) ) ;
return ( ICollection ) xomlStore . Deserialize ( this . serviceProvider ) ;
}
public override ICollection Deserialize ( SerializationStore store , IContainer container )
{
if ( store = = null ) throw new ArgumentNullException ( "store" ) ;
if ( container = = null ) throw new ArgumentNullException ( "container" ) ;
WorkflowMarkupSerializationStore xomlStore = store as WorkflowMarkupSerializationStore ;
if ( xomlStore = = null ) throw new InvalidOperationException ( SR . GetString ( SR . Error_UnknownSerializationStore ) ) ;
return xomlStore . Deserialize ( this . serviceProvider , container ) ;
}
// build 40409
// error CS0115: 'System.Workflow.ComponentModel.Design.XomlComponentSerializationService.DeserializeTo(System.ComponentModel.Design.Serialization.SerializationStore, System.ComponentModel.IContainer)': no suitable method found to override
// build 40420
// error CS0506: 'System.Workflow.ComponentModel.Design.XomlComponentSerializationService.DeserializeTo(System.ComponentModel.Design.Serialization.SerializationStore, System.ComponentModel.IContainer, bool)': cannot override inherited member 'System.ComponentModel.Design.Serialization.ComponentSerializationService.DeserializeTo(System.ComponentModel.Design.Serialization.SerializationStore, System.ComponentModel.IContainer, bool)' because it is not marked virtual, abstract, or override
public override void DeserializeTo ( SerializationStore store , IContainer container , bool validateRecycledTypes , bool applyDefaults )
{
//
if ( store = = null ) throw new ArgumentNullException ( "store" ) ;
if ( container = = null ) throw new ArgumentNullException ( "container" ) ;
WorkflowMarkupSerializationStore xomlStore = store as WorkflowMarkupSerializationStore ;
if ( xomlStore = = null ) throw new InvalidOperationException ( SR . GetString ( SR . Error_UnknownSerializationStore ) ) ;
xomlStore . DeserializeTo ( this . serviceProvider , container ) ;
}
internal static PropertyInfo GetProperty ( Type type , string name , BindingFlags bindingFlags )
{
PropertyInfo propertyInfo = null ;
try
{
propertyInfo = type . GetProperty ( name , bindingFlags ) ;
}
catch ( AmbiguousMatchException )
{
// this will ensure properties with "new" keyword are detected
PropertyInfo [ ] properties = type . GetProperties ( bindingFlags ) ;
foreach ( PropertyInfo prop in properties )
{
if ( prop . Name . Equals ( name , StringComparison . Ordinal ) )
{
propertyInfo = prop ;
break ;
}
}
}
return propertyInfo ;
}
}
[Serializable]
internal class WorkflowMarkupSerializationStore : SerializationStore ,
ISerializable
{
// keys used to persist data in binary stream
private const string SerializedXmlString = "XmlString" ;
private const string AssembliesKey = "Assemblies" ;
// these field are only used for Store creation.
private IServiceProvider serviceProvider = null ;
private List < Activity > activities = new List < Activity > ( ) ;
private List < string > parentObjectNameList = new List < string > ( ) ;
private List < MemberDescriptor > memberList = new List < MemberDescriptor > ( ) ;
// these fields persist across the store
private string serializedXmlString ;
private AssemblyName [ ] assemblies ;
internal WorkflowMarkupSerializationStore ( IServiceProvider serviceProvider )
{
this . serviceProvider = serviceProvider ;
}
private WorkflowMarkupSerializationStore ( SerializationInfo info , StreamingContext context )
{
this . serializedXmlString = ( String ) info . GetValue ( SerializedXmlString , typeof ( String ) ) ;
this . assemblies = ( AssemblyName [ ] ) info . GetValue ( AssembliesKey , typeof ( AssemblyName [ ] ) ) ;
}
private AssemblyName [ ] AssemblyNames
{
get
{
return this . assemblies ;
}
}
internal void AddObject ( object value )
{
if ( this . serializedXmlString ! = null )
throw new InvalidOperationException ( DR . GetString ( DR . InvalidOperationStoreAlreadyClosed ) ) ;
Activity activity = value as Activity ;
if ( activity = = null )
throw new ArgumentException ( "value" ) ;
this . activities . Add ( activity ) ;
}
internal void AddMember ( object value , MemberDescriptor member )
{
if ( value = = null )
throw new ArgumentNullException ( "value" ) ;
if ( member = = null )
throw new ArgumentNullException ( "member" ) ;
if ( this . serializedXmlString ! = null )
throw new InvalidOperationException ( DR . GetString ( DR . InvalidOperationStoreAlreadyClosed ) ) ;
IReferenceService referenceService = this . serviceProvider . GetService ( typeof ( IReferenceService ) ) as IReferenceService ;
this . parentObjectNameList . Add ( referenceService . GetName ( value ) ) ;
this . memberList . Add ( member ) ;
}
internal IList Deserialize ( IServiceProvider serviceProvider )
{
DesignerSerializationManager serializationManager = new LocalDesignerSerializationManager ( this , serviceProvider ) ;
using ( serializationManager . CreateSession ( ) )
{
ArrayList objects = new ArrayList ( ) ;
WorkflowMarkupSerializationManager xomlSerializationManager = new WorkflowMarkupSerializationManager ( serializationManager ) ;
2016-11-10 13:04:39 +00:00
XmlTextReader reader = new XmlTextReader ( this . serializedXmlString , XmlNodeType . Element , null ) { DtdProcessing = DtdProcessing . Prohibit } ;
2016-08-03 10:59:49 +00:00
reader . MoveToElement ( ) ;
do
{
if ( ! reader . Read ( ) )
return objects ;
xomlSerializationManager . FoundDefTag + = delegate ( object sender , WorkflowMarkupElementEventArgs eventArgs )
{
if ( eventArgs . XmlReader . LookupNamespace ( eventArgs . XmlReader . Prefix ) = = StandardXomlKeys . Definitions_XmlNs & &
xomlSerializationManager . Context . Current is Activity
)
WorkflowMarkupSerializationHelpers . ProcessDefTag ( xomlSerializationManager , eventArgs . XmlReader , xomlSerializationManager . Context . Current as Activity , true , string . Empty ) ;
} ;
WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer ( ) ;
object activityDecl = xomlSerializer . DeserializeObject ( xomlSerializationManager , reader ) ;
if ( activityDecl = = null )
throw new InvalidOperationException ( DR . GetString ( DR . InvalidOperationDeserializationReturnedNonActivity ) ) ;
if ( activityDecl is Activity )
( activityDecl as Activity ) . UserData . Remove ( UserDataKeys . CustomActivity ) ;
objects . Add ( activityDecl ) ;
} while ( true ) ;
}
}
internal ICollection Deserialize ( IServiceProvider serviceProvider , IContainer container )
{
throw new NotImplementedException ( ) ;
}
internal void DeserializeTo ( IServiceProvider serviceProvider , IContainer container )
{
DesignerSerializationManager serializationManager = new LocalDesignerSerializationManager ( this , serviceProvider ) ;
using ( serializationManager . CreateSession ( ) )
{
WorkflowMarkupSerializationManager xomlSerializationManager = new WorkflowMarkupSerializationManager ( serializationManager ) ;
PropertySegmentSerializationProvider propertySegmentSerializationProvider = new PropertySegmentSerializationProvider ( ) ;
xomlSerializationManager . AddSerializationProvider ( propertySegmentSerializationProvider ) ;
StringReader stringReader = new StringReader ( this . serializedXmlString ) ;
2016-11-10 13:04:39 +00:00
using ( XmlTextReader reader = new XmlTextReader ( stringReader ) { DtdProcessing = DtdProcessing . Prohibit } )
2016-08-03 10:59:49 +00:00
{
while ( reader . NodeType ! = XmlNodeType . Element & & reader . NodeType ! = XmlNodeType . ProcessingInstruction & & reader . Read ( ) ) ;
IReferenceService referenceService = this . serviceProvider . GetService ( typeof ( IReferenceService ) ) as IReferenceService ;
IComponentChangeService componentChangeService = this . serviceProvider . GetService ( typeof ( IComponentChangeService ) ) as IComponentChangeService ;
for ( int loop = 0 ; loop < this . memberList . Count ; loop + + )
{
object obj = referenceService . GetReference ( this . parentObjectNameList [ loop ] ) ;
if ( obj ! = null )
{
bool needChangeEvent = ( componentChangeService ! = null ) & & ( ! ( obj is IComponent ) | | ( ( ( IComponent ) obj ) . Site = = null ) ) ;
PropertyDescriptor member = this . memberList [ loop ] as PropertyDescriptor ;
if ( needChangeEvent )
componentChangeService . OnComponentChanging ( obj , member ) ;
xomlSerializationManager . Context . Push ( obj ) ;
PropertySegmentSerializer serializer = new PropertySegmentSerializer ( null ) ;
PropertySegment propertySegment = serializer . DeserializeObject ( xomlSerializationManager , reader ) as PropertySegment ;
System . Diagnostics . Debug . Assert ( obj = = xomlSerializationManager . Context . Current , "Serialization Store did not remove object which it pushed onto the stack." ) ;
xomlSerializationManager . Context . Pop ( ) ;
if ( needChangeEvent )
componentChangeService . OnComponentChanged ( obj , member , null , null ) ;
}
}
}
xomlSerializationManager . RemoveSerializationProvider ( propertySegmentSerializationProvider ) ;
}
}
#region ISerializable implementation
void ISerializable . GetObjectData ( SerializationInfo info , StreamingContext context )
{
info . AddValue ( SerializedXmlString , this . serializedXmlString ) ;
info . AddValue ( AssembliesKey , this . assemblies ) ;
}
#endregion
#region SerializationStore overrides
public override void Save ( Stream stream )
{
Close ( ) ;
BinaryFormatter f = new BinaryFormatter ( ) ;
f . Serialize ( stream , this ) ;
}
public override void Close ( )
{
if ( this . serializedXmlString ! = null )
return ;
DesignerSerializationManager serializationManager = new LocalDesignerSerializationManager ( this , serviceProvider ) ;
using ( serializationManager . CreateSession ( ) )
{
// serialize all objects
WorkflowMarkupSerializationManager xomlSerializationManager = new WorkflowMarkupSerializationManager ( serializationManager ) ;
StringWriter stringWriter = new StringWriter ( CultureInfo . InvariantCulture ) ;
using ( XmlTextWriter writer = new XmlTextWriter ( stringWriter ) )
{
if ( this . memberList . Count = = 0 )
{
WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer ( ) ;
foreach ( Activity activity in this . activities )
xomlSerializer . SerializeObject ( xomlSerializationManager , activity , writer ) ;
}
else
{
PropertySegmentSerializationProvider propertySegmentSerializationProvider = new PropertySegmentSerializationProvider ( ) ;
xomlSerializationManager . AddSerializationProvider ( propertySegmentSerializationProvider ) ;
xomlSerializationManager . Context . Push ( new StringWriter ( CultureInfo . InvariantCulture ) ) ;
IReferenceService referenceService = this . serviceProvider . GetService ( typeof ( IReferenceService ) ) as IReferenceService ;
if ( referenceService ! = null )
{
for ( int loop = 0 ; loop < this . memberList . Count ; loop + + )
{
object obj = referenceService . GetReference ( this . parentObjectNameList [ loop ] ) ;
PropertySegmentSerializer serializer = new PropertySegmentSerializer ( null ) ;
if ( this . memberList [ loop ] is PropertyDescriptor )
{
PropertyInfo propertyInfo = XomlComponentSerializationService . GetProperty ( obj . GetType ( ) , ( this . memberList [ loop ] as PropertyDescriptor ) . Name , BindingFlags . Public | BindingFlags . Instance ) ;
if ( propertyInfo ! = null )
serializer . SerializeObject ( xomlSerializationManager , new PropertySegment ( this . serviceProvider , obj , propertyInfo ) , writer ) ;
else
serializer . SerializeObject ( xomlSerializationManager , new PropertySegment ( this . serviceProvider , obj , this . memberList [ loop ] as PropertyDescriptor ) , writer ) ;
}
else if ( this . memberList [ loop ] is EventDescriptor )
{
// Events.
IEventBindingService eventBindingService = this . serviceProvider . GetService ( typeof ( IEventBindingService ) ) as IEventBindingService ;
if ( eventBindingService ! = null )
{
PropertySegment propertySegment = new PropertySegment ( serviceProvider , obj , eventBindingService . GetEventProperty ( this . memberList [ loop ] as EventDescriptor ) ) ;
serializer . SerializeObject ( xomlSerializationManager , propertySegment , writer ) ;
}
}
}
}
xomlSerializationManager . Context . Pop ( ) ;
xomlSerializationManager . RemoveSerializationProvider ( propertySegmentSerializationProvider ) ;
}
}
this . serializedXmlString = stringWriter . ToString ( ) ;
// store all the assembly names
List < AssemblyName > assemblyList = new List < AssemblyName > ( ) ;
foreach ( Activity activity in this . activities )
{
Assembly a = activity . GetType ( ) . Assembly ;
assemblyList . Add ( a . GetName ( true ) ) ;
}
this . assemblies = assemblyList . ToArray ( ) ;
this . activities . Clear ( ) ;
this . activities = null ;
}
}
public override System . Collections . ICollection Errors
{
get
{
return null ;
}
}
#endregion
#region Class LocalDesignerSerializationManager
private class LocalDesignerSerializationManager : DesignerSerializationManager
{
private WorkflowMarkupSerializationStore store ;
internal LocalDesignerSerializationManager ( WorkflowMarkupSerializationStore store , IServiceProvider provider )
: base ( provider )
{
this . store = store ;
}
[SuppressMessage("Microsoft.Globalization", "CA1307:SpecifyStringComparison", MessageId = "System.String.IndexOf(System.String)", Justification = "This is not a security issue because its a design time class")]
protected override Type GetType ( string name )
{
Type t = base . GetType ( name ) ;
if ( t = = null )
{
//When we try to load type from an assembly we need only the type name and not
//assembly qualified type name
int index = name . IndexOf ( "," ) ;
if ( index ! = - 1 )
name = name . Substring ( 0 , index ) ;
AssemblyName [ ] names = this . store . AssemblyNames ;
foreach ( AssemblyName n in names )
{
Assembly a = Assembly . Load ( n ) ;
if ( a ! = null )
{
t = a . GetType ( name ) ;
if ( t ! = null )
break ;
}
}
if ( t = = null )
{
// Failing that go after their dependencies.
foreach ( AssemblyName n in names )
{
Assembly a = Assembly . Load ( n ) ;
if ( a ! = null )
{
foreach ( AssemblyName dep in a . GetReferencedAssemblies ( ) )
{
Assembly aDep = Assembly . Load ( dep ) ;
if ( aDep ! = null )
{
t = aDep . GetType ( name ) ;
if ( t ! = null )
break ;
}
}
if ( t ! = null )
break ;
}
}
}
}
return t ;
}
}
#endregion
}
#region Class PropertySegment
internal sealed class PropertySegment
{
private IServiceProvider serviceProvider = null ;
private object obj = null ;
private PropertyInfo property = null ;
private PropertyDescriptor propertyDescriptor = null ;
public PropertySegment ( IServiceProvider serviceProvider , object obj )
{
this . serviceProvider = serviceProvider ;
this . obj = obj ;
}
internal PropertySegment ( IServiceProvider serviceProvider , object obj , PropertyInfo property )
{
this . serviceProvider = serviceProvider ;
this . obj = obj ;
this . property = property ;
}
internal PropertySegment ( IServiceProvider serviceProvider , object obj , PropertyDescriptor propertyDescriptor )
{
this . serviceProvider = serviceProvider ;
this . obj = obj ;
this . propertyDescriptor = propertyDescriptor ;
}
internal object Object
{
get { return this . obj ; }
}
internal IServiceProvider ServiceProvider
{
get
{
return this . serviceProvider ;
}
}
internal PropertyDescriptor PropertyDescriptor
{
get
{
PropertyDescriptor propertyDesc = this . propertyDescriptor ;
if ( propertyDesc = = null & & this . obj ! = null & & this . property ! = null )
propertyDesc = TypeDescriptor . GetProperties ( this . obj ) [ this . property . Name ] ;
return propertyDesc ;
}
}
internal PropertyInfo [ ] GetProperties ( IServiceProvider serviceProvider )
{
ArrayList properties = new ArrayList ( GetType ( ) . GetProperties ( ) ) ;
if ( this . property ! = null )
{
properties . Add ( new PropertySegmentPropertyInfo ( this , this . property ) ) ;
}
else if ( this . propertyDescriptor ! = null )
{
properties . Add ( new PropertySegmentPropertyInfo ( this , this . propertyDescriptor ) ) ;
}
else if ( this . obj ! = null )
{
PropertyDescriptorCollection props = null ;
TypeConverter converter = TypeDescriptor . GetConverter ( this . obj ) ;
if ( converter ! = null & & converter . GetPropertiesSupported ( ) )
{
DummyTypeDescriptorContext dummyContext = new DummyTypeDescriptorContext ( this . serviceProvider , GetComponent ( this . obj , serviceProvider ) , null ) ;
props = converter . GetProperties ( dummyContext , this . obj , new Attribute [ ] { } ) ;
}
else
props = TypeDescriptor . GetProperties ( this . obj ) ;
foreach ( PropertyDescriptor propDesc in props )
{
PropertyInfo propInfo = XomlComponentSerializationService . GetProperty ( this . obj . GetType ( ) , propDesc . Name , BindingFlags . Public | BindingFlags . Instance ) ;
if ( propInfo ! = null )
{
if ( Helpers . GetSerializationVisibility ( propInfo ) = = DesignerSerializationVisibility . Hidden )
continue ;
properties . Add ( new PropertySegmentPropertyInfo ( this , propInfo ) ) ;
}
else
{
properties . Add ( new PropertySegmentPropertyInfo ( this , propDesc ) ) ;
if ( propDesc . Converter ! = null )
{
DummyTypeDescriptorContext dummyContext = new DummyTypeDescriptorContext ( this . serviceProvider , GetComponent ( this . obj , serviceProvider ) , propDesc ) ;
if ( propDesc . Converter . GetPropertiesSupported ( dummyContext ) )
{
foreach ( PropertyDescriptor childDesc in propDesc . Converter . GetProperties ( dummyContext , this . obj , new Attribute [ ] { } ) )
{
properties . Add ( new PropertySegmentPropertyInfo ( this , childDesc ) ) ;
}
}
}
}
}
}
return properties . ToArray ( typeof ( PropertyInfo ) ) as PropertyInfo [ ] ;
}
private IComponent GetComponent ( object obj , IServiceProvider serviceProvider )
{
IComponent component = obj as IComponent ;
if ( ( component = = null | | component . Site = = null ) & & serviceProvider ! = null )
{
IReferenceService rs = serviceProvider . GetService ( typeof ( IReferenceService ) ) as IReferenceService ;
if ( rs ! = null )
component = rs . GetComponent ( obj ) ;
}
return component ;
}
}
#endregion
#region Class DummyTypeDescriptorContext
internal class DummyTypeDescriptorContext : ITypeDescriptorContext
{
private IServiceProvider serviceProvider ;
private object component = null ;
private PropertyDescriptor propDescriptor = null ;
public DummyTypeDescriptorContext ( IServiceProvider serviceProvider , object component , PropertyDescriptor propDescriptor )
{
this . serviceProvider = serviceProvider ;
this . propDescriptor = propDescriptor ;
this . component = component ;
}
public IContainer Container { get { return null ; } }
public object Instance { get { return this . component ; } }
public PropertyDescriptor PropertyDescriptor { get { return this . propDescriptor ; } }
public void OnComponentChanged ( ) { }
public bool OnComponentChanging ( ) { return true ; }
public object GetService ( Type serviceType )
{
if ( this . serviceProvider ! = null )
return this . serviceProvider . GetService ( serviceType ) ;
else
return null ;
}
}
#endregion
#region Class PropertySegmentPropertyInfo
internal sealed class PropertySegmentPropertyInfo : PropertyInfo
{
private PropertyInfo realPropInfo = null ;
private PropertyDescriptor realPropDesc = null ;
private PropertySegment propertySegment ;
internal PropertySegmentPropertyInfo ( PropertySegment propertySegment , PropertyInfo realPropInfo )
{
this . realPropInfo = realPropInfo ;
this . propertySegment = propertySegment ;
}
internal PropertySegmentPropertyInfo ( PropertySegment propertySegment , PropertyDescriptor realPropDesc )
{
this . realPropDesc = realPropDesc ;
this . propertySegment = propertySegment ;
}
internal PropertySegment PropertySegment
{
get
{
return this . propertySegment ;
}
}
#region Property Info overrides
public override Type PropertyType
{
get
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . PropertyType ;
else if ( this . realPropDesc ! = null )
return this . realPropDesc . PropertyType ;
return null ;
}
}
public override object GetValue ( object obj , BindingFlags invokeAttr , Binder binder , object [ ] index , CultureInfo culture )
{
DependencyProperty dependencyProperty = null ;
Activity activity = null ;
if ( this . propertySegment ! = null )
activity = this . propertySegment . Object as Activity ;
if ( activity ! = null )
{
string propertyName = Name ;
Type propertyType = DeclaringType ;
if ( ! String . IsNullOrEmpty ( propertyName ) & & propertyType ! = null )
dependencyProperty = DependencyProperty . FromName ( propertyName , propertyType ) ;
}
object value = null ;
object targetObj = ( this . propertySegment = = null ) ? obj : this . propertySegment . Object ;
if ( dependencyProperty ! = null & & ! dependencyProperty . DefaultMetadata . IsMetaProperty )
{
// If this is not a Bind, we retrieve the value through the property descriptor.
// If we have directly assigned the value to the property then GetBinding is going to return null
// If that happens then we need to make sure that we get at the actual value
if ( activity . IsBindingSet ( dependencyProperty ) )
value = activity . GetBinding ( dependencyProperty ) ;
else if ( ! dependencyProperty . IsEvent )
value = activity . GetValue ( dependencyProperty ) ;
else
value = activity . GetHandler ( dependencyProperty ) ;
}
if ( value = = null )
{
if ( this . realPropInfo ! = null )
value = this . realPropInfo . GetValue ( targetObj , invokeAttr , binder , index , culture ) ;
else if ( this . realPropDesc ! = null )
value = this . realPropDesc . GetValue ( targetObj ) ;
}
return value ;
}
public override void SetValue ( object obj , object value , BindingFlags invokeAttr , Binder binder , object [ ] index , CultureInfo culture )
{
if ( obj = = null )
throw new ArgumentNullException ( "obj" ) ;
string propertyName = Name ;
DependencyProperty dependencyProperty = null ;
PropertySegment propertySegment = obj as PropertySegment ;
Activity activity = ( propertySegment ! = null ) ? propertySegment . Object as Activity : obj as Activity ;
if ( activity ! = null )
{
Type propertyType = DeclaringType ;
if ( ! String . IsNullOrEmpty ( propertyName ) & & propertyType ! = null )
dependencyProperty = DependencyProperty . FromName ( propertyName , propertyType ) ;
}
PropertyDescriptor propertyDescriptor = null ;
object destnObject = null ;
if ( propertySegment ! = null )
{
PropertyDescriptorCollection props = null ;
TypeConverter converter = TypeDescriptor . GetConverter ( propertySegment . Object ) ;
if ( converter ! = null & & converter . GetPropertiesSupported ( ) )
{
DummyTypeDescriptorContext dummyContext = new DummyTypeDescriptorContext ( propertySegment . ServiceProvider , propertySegment . Object , this . realPropDesc ) ;
props = converter . GetProperties ( dummyContext , propertySegment . Object , new Attribute [ ] { } ) ;
}
else
props = TypeDescriptor . GetProperties ( propertySegment . Object ) ;
foreach ( PropertyDescriptor propDesc in props )
{
if ( propDesc . Name = = propertyName )
{
propertyDescriptor = propDesc ;
}
else if ( propDesc . Converter ! = null )
{
DummyTypeDescriptorContext dummyContext = new DummyTypeDescriptorContext ( propertySegment . ServiceProvider , propertySegment . Object , propDesc ) ;
if ( propDesc . GetValue ( propertySegment . Object ) ! = null & & propDesc . Converter . GetPropertiesSupported ( dummyContext ) )
{
foreach ( PropertyDescriptor childDesc in propDesc . Converter . GetProperties ( dummyContext , propDesc . GetValue ( propertySegment . Object ) , new Attribute [ ] { } ) )
{
if ( childDesc . Name = = propertyName )
propertyDescriptor = childDesc ;
}
}
}
}
destnObject = propertySegment . Object ;
}
else
{
propertyDescriptor = TypeDescriptor . GetProperties ( obj ) [ propertyName ] ;
destnObject = obj ;
}
if ( propertyDescriptor ! = null & & destnObject ! = null )
propertyDescriptor . SetValue ( destnObject , value ) ;
}
public override MethodInfo [ ] GetAccessors ( bool nonPublic )
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . GetAccessors ( nonPublic ) ;
return new MethodInfo [ 0 ] ;
}
public override MethodInfo GetGetMethod ( bool nonPublic )
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . GetGetMethod ( nonPublic ) ;
return null ;
}
public override MethodInfo GetSetMethod ( bool nonPublic )
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . GetSetMethod ( nonPublic ) ;
return null ;
}
public override ParameterInfo [ ] GetIndexParameters ( )
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . GetIndexParameters ( ) ;
return new ParameterInfo [ 0 ] ;
}
public override PropertyAttributes Attributes
{
get
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . Attributes ;
return PropertyAttributes . None ;
}
}
public override bool CanRead
{
get
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . CanRead ;
return true ;
}
}
public override bool CanWrite
{
get
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . CanWrite ;
else if ( this . realPropDesc ! = null )
return ! ( this . realPropDesc . IsReadOnly ) ;
return false ;
}
}
public override string Name
{
get
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . Name ;
else if ( this . realPropDesc ! = null )
return this . realPropDesc . Name ;
return String . Empty ;
}
}
public override Type DeclaringType
{
get
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . DeclaringType ;
else if ( this . realPropDesc ! = null )
return this . realPropDesc . ComponentType ;
return null ;
}
}
public override Type ReflectedType
{
get
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . ReflectedType ;
return null ;
}
}
#endregion
#region MemberInfo Overrides
public override object [ ] GetCustomAttributes ( bool inherit )
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . GetCustomAttributes ( inherit ) ;
return new AttributeInfoAttribute [ 0 ] ;
}
public override object [ ] GetCustomAttributes ( Type attributeType , bool inherit )
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . GetCustomAttributes ( attributeType , inherit ) ;
return new AttributeInfoAttribute [ 0 ] ;
}
public override bool IsDefined ( Type attributeType , bool inherit )
{
if ( this . realPropInfo ! = null )
return this . realPropInfo . IsDefined ( attributeType , inherit ) ;
return false ;
}
#endregion
}
#endregion
}