c # Могу ли я предотвратить конфликт моих аргументов конструктора с использованием VBA?

2

Я немного озадачен тем, как я могу переопределить конструкторы, требующие аргументы, при использовании их классов в среде VBA.

Что работает?

Я создал несколько классов в библиотеке, каждый с интерфейсом, чтобы обеспечить полную совместимость с intellisense при использовании этой библиотеки в VBA

С конструкторами или без них эти классы работают нормально, например

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("JamHeadArt.ClassEX")]
[Guid("XYZ")]
public partial class ClassEX : IClassEX
{

    public ClassEX()
    {
        // Empty constructor here, some of mine have processes, all work well
    }  

    // Methods/ Properties as outlined by the interface below
}

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("ABC")]
public interface IClassEx
{
    // Various methods / fields / properties to be implemented by ClassEX
}

Затем я добавляю ссылку на мою библиотеку и пишу простые строки кода в VBA для создания экземпляров и доступа к моим классам:

Sub Test()
Dim t As JamHeadArt.ClassEX
Set t = New JamHeadArt.ClassEX
' Using t.dot then provides all the methods needed '
End Sub

Что идет не так?

Когда я создаю в классе consttructors с аргументами (даже если они необязательны), VBA прекращает разрешать мне создавать экземпляры этих классов, он сообщает мне, что ключевое слово "New" недопустимо и фактически не позволяет мне выбирать класс из intellisense список объектов в моей библиотеке, если я Dim t As New JamHeadArt.ClassEx даже если для параметров задано необязательное значение (поэтому в действительности не требуется)

Раздражает то, что на самом деле я не хочу, чтобы мои экземпляры VBA принимали параметры через конструктор, они в основном предназначены для модульного тестирования и являются необязательными строками, поэтому по умолчанию используется значение ""... поэтому я предполагаю, что мой вопрос что-то вроде

Можно ли переопределить какие-либо параметры конструктора, чтобы при обращении к ним в среде VBA они игнорировались?

например, я действительно хочу, чтобы мой конструктор выглядел так:

public ClassEX(string s = "")
{

} 

и в VBA он должен работать как прежде Dim t As New JamHeadArt.ClassEX - но это не будет с этой необязательной строкой!

  • 1
    Разве вы не можете просто добавить дополнительный конструктор? то есть: один без параметров, другой с параметрами для модульного тестирования
  • 1
    Я не работал с VBA, но в C # вы можете иметь internal конструктор и public конструктор. Внутренний может быть для модульного тестирования, а публичный - для VBA. Используйте InternalsVisibleToAttribute чтобы этот конструктор мог видеть только приложение модульного тестирования. Это возможное решение, но я не люблю писать код только для модульного тестирования. В основном это недостаток дизайна, но иногда другого пути нет. Трудно сказать, поскольку у меня ограниченная информация о вашем деле, но, по крайней мере, это одно из решений.
Показать ещё 5 комментариев
Теги:

1 ответ

1
Лучший ответ

Вы можете добавить дополнительный конструктор, например:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("JamHeadArt.ClassEX")]
[Guid("XYZ")]
public partial class ClassEX : IClassEX
{
    public ClassEX()
    {
        // Empty constructor here, some of mine have processes, all work well
    }  

    public ClassEX(string foo)
    {
        // additional constructor, can be used for unit testing etc.
    }  

    // Methods/ Properties as outlined by the interface below
}
  • 0
    Спасибо Стефану, это лучшее решение для меня - оно не идеальное, потому что я должен в основном копировать и вставлять все из одного в другое, но это из-за плохого написания кода, который изначально устанавливал плохую среду!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню