e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
397 lines
11 KiB
C#
397 lines
11 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
namespace System.Activities
|
|
{
|
|
using System;
|
|
using System.Activities.Runtime;
|
|
using System.Activities.Validation;
|
|
using System.Activities.XamlIntegration;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
using System.Runtime;
|
|
using System.Windows.Markup;
|
|
using System.Xaml;
|
|
|
|
[ContentProperty("Implementation")]
|
|
public sealed class DynamicActivity : Activity, ICustomTypeDescriptor, IDynamicActivity
|
|
{
|
|
Activity runtimeImplementation;
|
|
DynamicActivityTypeDescriptor typeDescriptor;
|
|
Collection<Attribute> attributes;
|
|
|
|
public DynamicActivity()
|
|
: base()
|
|
{
|
|
this.typeDescriptor = new DynamicActivityTypeDescriptor(this);
|
|
}
|
|
|
|
public string Name
|
|
{
|
|
get
|
|
{
|
|
return this.typeDescriptor.Name;
|
|
}
|
|
set
|
|
{
|
|
this.typeDescriptor.Name = value;
|
|
}
|
|
}
|
|
|
|
[DependsOn("Name")]
|
|
public Collection<Attribute> Attributes
|
|
{
|
|
get
|
|
{
|
|
if (this.attributes == null)
|
|
{
|
|
this.attributes = new Collection<Attribute>();
|
|
}
|
|
return this.attributes;
|
|
}
|
|
}
|
|
|
|
[Browsable(false)]
|
|
[DependsOn("Attributes")]
|
|
public KeyedCollection<string, DynamicActivityProperty> Properties
|
|
{
|
|
get
|
|
{
|
|
return this.typeDescriptor.Properties;
|
|
}
|
|
}
|
|
|
|
[DependsOn("Properties")]
|
|
public new Collection<Constraint> Constraints
|
|
{
|
|
get
|
|
{
|
|
return base.Constraints;
|
|
}
|
|
}
|
|
|
|
[TypeConverter(typeof(ImplementationVersionConverter))]
|
|
[DefaultValue(null)]
|
|
public new Version ImplementationVersion
|
|
{
|
|
get
|
|
{
|
|
return base.ImplementationVersion;
|
|
}
|
|
set
|
|
{
|
|
base.ImplementationVersion = value;
|
|
}
|
|
}
|
|
|
|
[XamlDeferLoad(typeof(FuncDeferringLoader), typeof(Activity))]
|
|
[DefaultValue(null)]
|
|
[Browsable(false)]
|
|
[Ambient]
|
|
public new Func<Activity> Implementation
|
|
{
|
|
get
|
|
{
|
|
return base.Implementation;
|
|
}
|
|
set
|
|
{
|
|
base.Implementation = value;
|
|
}
|
|
}
|
|
|
|
KeyedCollection<string, DynamicActivityProperty> IDynamicActivity.Properties
|
|
{
|
|
get
|
|
{
|
|
return this.Properties;
|
|
}
|
|
}
|
|
|
|
internal override void InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)
|
|
{
|
|
if (this.runtimeImplementation != null)
|
|
{
|
|
executor.ScheduleActivity(this.runtimeImplementation, instance, null, null, null);
|
|
}
|
|
}
|
|
|
|
sealed internal override void OnInternalCacheMetadata(bool createEmptyBindings)
|
|
{
|
|
Activity body = null;
|
|
if (this.Implementation != null)
|
|
{
|
|
body = this.Implementation();
|
|
}
|
|
|
|
if (body != null)
|
|
{
|
|
SetImplementationChildrenCollection(new Collection<Activity> { body });
|
|
}
|
|
|
|
// Always cache the last body that we returned
|
|
this.runtimeImplementation = body;
|
|
|
|
ReflectedInformation information = new ReflectedInformation(this);
|
|
|
|
SetImportedChildrenCollection(information.GetChildren());
|
|
SetVariablesCollection(information.GetVariables());
|
|
SetImportedDelegatesCollection(information.GetDelegates());
|
|
SetArgumentsCollection(information.GetArguments(), createEmptyBindings);
|
|
}
|
|
|
|
AttributeCollection ICustomTypeDescriptor.GetAttributes()
|
|
{
|
|
return this.typeDescriptor.GetAttributes();
|
|
}
|
|
|
|
string ICustomTypeDescriptor.GetClassName()
|
|
{
|
|
return this.typeDescriptor.GetClassName();
|
|
}
|
|
|
|
string ICustomTypeDescriptor.GetComponentName()
|
|
{
|
|
return this.typeDescriptor.GetComponentName();
|
|
}
|
|
|
|
TypeConverter ICustomTypeDescriptor.GetConverter()
|
|
{
|
|
return this.typeDescriptor.GetConverter();
|
|
}
|
|
|
|
EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
|
|
{
|
|
return this.typeDescriptor.GetDefaultEvent();
|
|
}
|
|
|
|
PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
|
|
{
|
|
return this.typeDescriptor.GetDefaultProperty();
|
|
}
|
|
|
|
object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
|
|
{
|
|
return this.typeDescriptor.GetEditor(editorBaseType);
|
|
}
|
|
|
|
EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
|
|
{
|
|
return this.typeDescriptor.GetEvents(attributes);
|
|
}
|
|
|
|
EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
|
|
{
|
|
return this.typeDescriptor.GetEvents();
|
|
}
|
|
|
|
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
|
|
{
|
|
return this.typeDescriptor.GetProperties();
|
|
}
|
|
|
|
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
|
|
{
|
|
return this.typeDescriptor.GetProperties(attributes);
|
|
}
|
|
|
|
object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
|
|
{
|
|
return this.typeDescriptor.GetPropertyOwner(pd);
|
|
}
|
|
}
|
|
|
|
[ContentProperty("Implementation")]
|
|
public sealed class DynamicActivity<TResult> : Activity<TResult>, ICustomTypeDescriptor, IDynamicActivity
|
|
{
|
|
Activity runtimeImplementation;
|
|
DynamicActivityTypeDescriptor typeDescriptor;
|
|
Collection<Attribute> attributes;
|
|
|
|
public DynamicActivity()
|
|
: base()
|
|
{
|
|
this.typeDescriptor = new DynamicActivityTypeDescriptor(this);
|
|
}
|
|
|
|
public string Name
|
|
{
|
|
get
|
|
{
|
|
return this.typeDescriptor.Name;
|
|
}
|
|
set
|
|
{
|
|
this.typeDescriptor.Name = value;
|
|
}
|
|
}
|
|
|
|
[DependsOn("Name")]
|
|
public Collection<Attribute> Attributes
|
|
{
|
|
get
|
|
{
|
|
if (this.attributes == null)
|
|
{
|
|
this.attributes = new Collection<Attribute>();
|
|
}
|
|
return this.attributes;
|
|
}
|
|
}
|
|
|
|
[Browsable(false)]
|
|
[DependsOn("Attributes")]
|
|
public KeyedCollection<string, DynamicActivityProperty> Properties
|
|
{
|
|
get
|
|
{
|
|
return this.typeDescriptor.Properties;
|
|
}
|
|
}
|
|
|
|
[DependsOn("Properties")]
|
|
public new Collection<Constraint> Constraints
|
|
{
|
|
get
|
|
{
|
|
return base.Constraints;
|
|
}
|
|
}
|
|
|
|
[TypeConverter(typeof(ImplementationVersionConverter))]
|
|
[DefaultValue(null)]
|
|
public new Version ImplementationVersion
|
|
{
|
|
get
|
|
{
|
|
return base.ImplementationVersion;
|
|
}
|
|
set
|
|
{
|
|
base.ImplementationVersion = value;
|
|
}
|
|
}
|
|
|
|
[XamlDeferLoad(typeof(FuncDeferringLoader), typeof(Activity))]
|
|
[DefaultValue(null)]
|
|
[Browsable(false)]
|
|
[Ambient]
|
|
public new Func<Activity> Implementation
|
|
{
|
|
get
|
|
{
|
|
return base.Implementation;
|
|
}
|
|
set
|
|
{
|
|
base.Implementation = value;
|
|
}
|
|
}
|
|
|
|
KeyedCollection<string, DynamicActivityProperty> IDynamicActivity.Properties
|
|
{
|
|
get
|
|
{
|
|
return this.Properties;
|
|
}
|
|
}
|
|
|
|
internal override void InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)
|
|
{
|
|
if (this.runtimeImplementation != null)
|
|
{
|
|
executor.ScheduleActivity(this.runtimeImplementation, instance, null, null, null);
|
|
}
|
|
}
|
|
|
|
sealed internal override void OnInternalCacheMetadataExceptResult(bool createEmptyBindings)
|
|
{
|
|
Activity body = null;
|
|
if (this.Implementation != null)
|
|
{
|
|
body = this.Implementation();
|
|
}
|
|
|
|
if (body != null)
|
|
{
|
|
SetImplementationChildrenCollection(new Collection<Activity> { body });
|
|
}
|
|
|
|
// Always cache the last body that we returned
|
|
this.runtimeImplementation = body;
|
|
|
|
ReflectedInformation information = new ReflectedInformation(this);
|
|
|
|
SetImportedChildrenCollection(information.GetChildren());
|
|
SetVariablesCollection(information.GetVariables());
|
|
SetImportedDelegatesCollection(information.GetDelegates());
|
|
SetArgumentsCollection(information.GetArguments(), createEmptyBindings);
|
|
}
|
|
|
|
AttributeCollection ICustomTypeDescriptor.GetAttributes()
|
|
{
|
|
return this.typeDescriptor.GetAttributes();
|
|
}
|
|
|
|
string ICustomTypeDescriptor.GetClassName()
|
|
{
|
|
return this.typeDescriptor.GetClassName();
|
|
}
|
|
|
|
string ICustomTypeDescriptor.GetComponentName()
|
|
{
|
|
return this.typeDescriptor.GetComponentName();
|
|
}
|
|
|
|
TypeConverter ICustomTypeDescriptor.GetConverter()
|
|
{
|
|
return this.typeDescriptor.GetConverter();
|
|
}
|
|
|
|
EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
|
|
{
|
|
return this.typeDescriptor.GetDefaultEvent();
|
|
}
|
|
|
|
PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
|
|
{
|
|
return this.typeDescriptor.GetDefaultProperty();
|
|
}
|
|
|
|
object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
|
|
{
|
|
return this.typeDescriptor.GetEditor(editorBaseType);
|
|
}
|
|
|
|
EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
|
|
{
|
|
return this.typeDescriptor.GetEvents(attributes);
|
|
}
|
|
|
|
EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
|
|
{
|
|
return this.typeDescriptor.GetEvents();
|
|
}
|
|
|
|
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
|
|
{
|
|
return this.typeDescriptor.GetProperties();
|
|
}
|
|
|
|
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
|
|
{
|
|
return this.typeDescriptor.GetProperties(attributes);
|
|
}
|
|
|
|
object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
|
|
{
|
|
return this.typeDescriptor.GetPropertyOwner(pd);
|
|
}
|
|
}
|
|
}
|
|
|
|
|