代码之家  ›  专栏  ›  技术社区  ›  stakx - no longer contributing Saravana Kumar

Workflow Foundation(WF)-为什么使用SetValue()将DependencyProperty设置为COM对象会引发ArgumentException?

  •  1
  • stakx - no longer contributing Saravana Kumar  · 技术社区  · 16 年前

    假设我有一个.NET工作流基础(WF) SequenceActivity 使用以下“output”属性初始化:

    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 this.Workspace ):

    类型 […].IWorkspace 依赖性属性 Workspace 与值的类型不匹配 System.__ComObject
    (翻译自德语,英语例外文本可能略有不同)

    一旦我注册了依赖属性 typeof(object) typeof(IWorkspace) 作为第二个参数,代码执行得很好。但是,这会导致可能会将任何值赋给dependency属性,我不希望这样。

    在我看来,WF依赖属性对COM互操作对象不起作用。
    有人能解决这个问题吗?

    1 回复  |  直到 16 年前
        1
  •  1
  •   stakx - no longer contributing    16 年前

    为了给我自己的问题一个第一个答案,我发现这项工作是可行的:

    如果COM对象被包装在.NET对象中,Workflow Foundation将能够处理它。


    (1) 首先定义泛型助手类:

    public class Wrapped<T>
    {
        T Value { get; set; }
    
        public Wrapped(T init)
        {
            Value = init;
        }
    }
    

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

    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));
    

    最后,分配给 Workspace 属性现在变为:

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

    虽然这很好用,但它仍然只是一个解决方法。
    如果有人有更优雅的解决方案,我很乐意听听。

    推荐文章