2010-04-15 37 views
1

假设我有一个.NET工作流基础(WF)SequenceActivity类下面的“输出”属性:Workflow Foundation(WF) - 为什么使用SetValue()将一个DependencyProperty设置为一个COM对象会引发一个ArgumentException?

public IWorkspace Workspace { get; private set; } 
//  ^^^^^^^^^^ 
//  important: this is a COM interface type! 

public static DependencyProperty WorkspaceProperty = DependencyProperty.Register(
     "Workspace", 
     typeof(IWorkspace), 
     typeof(FoobarActivity)); // <-- this activity class 

该活动执行一些代码,设置两个以上这样的:

this.Workspace = ...; // exact code not relevant; property set to a COM object 
SetValue(WorkspaceProperty, this.Workspace); 

最后一行(这使得调用SetValue)在ArgumentException结果用于第二帕ameter(具有this.Workspace值):

依赖属性Workspace[…].IWorkspace类型不匹配值的类型System.__ComObject
                                                                                 当我注册依赖属性与typeof(object)代替typeof(IWorkspace)作为第二个参数(德国翻译,英文异常文本可能稍有不同)

,代码执行就好了。但是,这将导致可能性将任何值分配给依赖项属性,而我不希望这样做。

在我看来,WF依赖项属性不适用于COM互操作对象。
有没有人有解决方案?

+0

顺便说一句,转移到.NET 4.0并使用'动态'(它*可能*解决问题)目前不是一种选择。 – stakx 2010-04-19 07:20:15

回答

1

授予第一个答案,以我自己的问题,我发现这个变通的工作:

如果COM对象被包裹在一个.NET对象,工作流基础将能对付它。


(1)首先定义一个通用的辅助类:

public class Wrapped<T> 
{ 
    T Value { get; set; } 

    public Wrapped(T init) 
    { 
     Value = init; 
    } 
} 

(2)然后,将上述活动的属性定义更改为:

public Wrapped<IWorkspace> Workspace { get; private set; } 
//  ^^^^^^^^^^^^^^^^^^^ 
//  this is now a .NET class type wrapping a COM object instance. 

public static DependencyProperty WorkspaceProperty = DependencyProperty.Register(
     "Workspace", 
     typeof(Wrapped<IWorkspace>), 
     typeof(FoobarActivity)); 

(3)最后,分配到Workspace属性现在变成了:

this.Workspace = new Wrapped<IWorkspace>(...); 

虽然这工作得很好,它仍然只是一种变通方法。
如果有人有更优雅的解决方案,我很乐意听到它。

相关问题