Workflow Foundation (WF). Почему установка свойства DependencyProperty для COM-объекта с помощью SetValue () создает исключение ArgumentException? - PullRequest
1 голос
/ 16 апреля 2010

Предположим, у меня есть класс .NET Workflow Foundation (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) в качестве второго параметра, код выполняется просто отлично. Однако это привело бы к возможности присвоить практически любое значение свойству зависимости, и я этого не хочу.

Мне кажется, что свойства зависимостей WF не работают для COM-объектов взаимодействия.
У кого-нибудь есть решение этой проблемы?

1 Ответ

1 голос
/ 16 апреля 2010

Чтобы дать первый ответ на свой вопрос, я нашел этот обходной путь:

Если объект COM обернут в объект .NET, Workflow Foundation сможет справиться с ним.


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

Хотя это работает просто отлично, это все еще только обходной путь.
Если у кого-то есть более элегантное решение, я бы хотел услышать об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...