У меня есть базовый базовый класс-обертка, чтобы обернуть пару используемых нами ком-компонентов:
public class WrapperBase<T> : IDisposable
where T : new()
{
private T comObject = default(T);
private ComponentParameters parameters = null;
protected WrapperBase()
{
comObject = new T();
Initialize();
}
public void SetParameters(ComponentParameters parameters)
{
// ...
this.parameters = parameters;
}
// ...
}
Теперь у меня есть конкретный класс-обертка, который наследуется от этого базового класса:
public class UserWrapper : WrapperBase<CUserClass>
{
public UserWrapper() : base() { }
public void SomeUserWrapperMethod()
{
// ...
}
}
Используемый тип (CUserClass) является типом взаимодействия COM. Этот тип доступен после добавления COM-объекта в качестве ссылки на проект.
Теперь я использую этот класс в другой сборке (которая ссылается на сборку, в которой определены вышеуказанные типы):
using (var user = new UserWrapper())
{
user.SomeUserWrapperMethod();
}
Приведенный выше код компилируется нормально, но если я на самом деле вызываю метод SetParameters (который определен только в классе Wrapperbase):
using (var user = new UserWrapper())
{
user.SetParameters(someParameters);
}
Я получаю (двойную) ошибку компиляции:
- ошибка CS0012: тип 'ComponentsAssembly.CUserClass' определен
в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку
«Interop.ComponentsAssembly,
Версия = 1.0.0.0, Культура = нейтральная,
PublicKeyToken = ... '.
- ComponentWrappers.dll: (Связанный файл)
Ошибка CS0310: «ComponentsAssembly.CUserClass» должен быть
не абстрактный тип с открытым конструктором без параметров для того, чтобы
используйте его как параметр 'T' в универсальном типе или методе 'Contact.Wrappers.WrapperBase'
Я пытался добавить ссылку на компонент, но все равно получаю то же сообщение об ошибке.
Раньше это работало до того, как я изменил WrapperBase на универсальный тип, но затем было много кода, идентичного во всех конкретных оболочках, поэтому я реорганизовал его, сделав WrapperBase универсальным.
Я действительно могу решить эту проблему, добавив конструктор к конкретному классу, который принимает в качестве параметра «ComponentParameters» и вызывает внутренние параметры SetParameters:
public class UserWrapper : WrapperBase<CUserClass>
{
public UserWrapper() : base() { }
public UserWrapper(ComponentParameters parameters) : base()
{
SetParameters(parameters)
}
}
И затем использовать это так:
using (var user = new UserWrapper(someParameters))
{
user.SomeUserWrapperMethod();
}
Но я бы предпочел, чтобы оба метода работали (используя конструктор и явно вызывая SetParameters).
Может ли кто-нибудь объяснить мне, что именно здесь происходит, поскольку я в течение последних нескольких часов бился головой о стену.