Menci Lucio Ответов: 1

Как вызвать Visual basic property getter с аргументами в решениях C#


Всем привет,

Давным-давно я написал длинный проект Visual Basic, где класс имеет несколько свойств с несколькими аргументами.

Теперь я должен реализовать этот проект в существующем решении, написанном на C#. Единственный способ, который я нашел, чтобы вызвать эти свойства getter/setter, - это отражение.
Ты знаешь другой способ?

Что я уже пробовал:

VB
Public Class Manager
    Public Property Message() As String
        Get
            Return Message(Nothing, Nothing)
        End Get
        Set(value as String)
            Message(Nothing, Nothing) = value
        End Set
    End Property
    Public Property Message(useSQLInfo As Boolean?) As String
        Get
            Return Message(useSQLInfo, Nothing)
        End Get
        Set(value as String)
            Message(useSQLInfo, Nothing) = value
        End Set
    End Property
    Public Property Message(useSQLInfo As Boolean?, manageRN As Boolean?) As String
        Get
            [...]
        End Get
        Set(value as String)
            [...]
        End Set
    End Property
End Class


C#
class Foo {
    Manager manager = CreateManager();
    [...]
    void SaveExchange([...]) {
        if (manager != null) {
            string managerMessage = ManagerGetMessage(manager, true, null);
            [...]
        }
    }
    private static MethodInfo mgmMethodInfo = null;
    string ManagerGetMessage(Manager manager, bool? useSQLInfo, bool? manageRN) {
        if (mgmMethodInfo == null)
            mgmMethodInfo = manager.GetType().GetProperty("Message", typeof(string),
                    new Type[] { typeof(bool?), typeof(bool?) } ).GetGetMethod();
        return mgmMethodInfo.Invoke(manager, new object[] { useSQLInfo, manageRN} );
    }
}


Если кто-то знает, что другой метод хорошо принят.

Спасибо
Лусио

Graeme_Grant

Вы пытаетесь использовать оба VB &C# в одной и той же скомпилированной DLL/EXE или каждый из них находится в своей собственной DLL/EXE?

Menci Lucio

Это два разных проекта, которые создают разные dll/exe в одном и том же решении (для отладки). Я смог вызвать все методы и другие свойства менеджера внутри проекта C#.

1 Ответов

Рейтинг:
4

Graeme_Grant

Если код VB находится в библиотеке классов, то вы можете ссылаться на него и использовать его так же, как и библиотеку классов C#.

Вот тест, чтобы показать, как это работает:

1. добавьте консольное приложение C# в решение
2. Добавьте в решение библиотеку классов VB
3. обратитесь к библиотеке классов VB в консольном приложении C#
4. используйте следующий код:

Библиотека классов VB

Public Class Class1

    Public Function GetString() As String
        Return "Hello from VB!"
    End Function

End Class

Консольное приложение C#
namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var vbClass = new ClassLibrary1.Class1();

            Console.WriteLine(vbClass.GetString());
            Console.ReadKey();
        }
    }
}

5. Теперь скомпилируйте и запустите программу, и она будет работать. :)

** Обновление теста свойств

Библиотека классов VB
Public Class Class1

    Public Function GetString() As String
        Return "Hello from VB!"
    End Function

    Private test As String
    Public Property TestProperty() As String
        Get
            Return test
        End Get
        Set(ByVal value As String)
            test = value
        End Set
    End Property

End Class

Консольное приложение C#
using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var vbClass = new ClassLibrary1.Class1();

            // Test 1
            Console.WriteLine(vbClass.GetString());

            // Test 2
            vbClass.TestProperty = "This is a VB property test";
            Console.WriteLine(vbClass.TestProperty);

            Console.ReadKey();
        }
    }
}

Выход
Hello from VB!
This is a VB property test


** Обновление 2: доступ к свойству VB с помощью paramater
У Intellisense был ответ для вас. Смотреть ниже:

Библиотека классов VB
Imports System.Runtime.CompilerServices

Public Class Class1

    Public Function GetString() As String
        Return "Hello from VB!"
    End Function

    Private test As String
    Public Property TestProperty() As String
        Get
            Return test
        End Get
        Set(ByVal value As String)
            test = value
        End Set
    End Property

    Public Property Message() As String
        Get
            Return Message(Nothing, Nothing)
        End Get
        Set(value As String)
            Message(Nothing, Nothing) = value
        End Set
    End Property
    Public Property Message(useSQLInfo As Boolean?) As String
        Get
            Return Message(useSQLInfo, Nothing)
        End Get
        Set(value As String)
            Message(useSQLInfo, Nothing) = value
        End Set
    End Property

    Private flag1 As Boolean?
    Private flag2 As Boolean?
    Private messageText As String

    Public Property Message(useSQLInfo As Boolean?, manageRN As Boolean?) As String
        Get
            Return messageText
        End Get
        Set(value As String)
            messageText = value
        End Set
    End Property

End Class

Консольное приложение C#
using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var vbClass = new ClassLibrary1.Class1();

            // Test 1
            Console.WriteLine(vbClass.GetString());

            // Test 2
            vbClass.TestProperty = "This is a VB property test";
            Console.WriteLine(vbClass.TestProperty);

            // test 3
            vbClass.set_Message(true, "test message");
            Console.WriteLine(vbClass.get_Message(true));

            Console.ReadKey();
        }
    }
}


Menci Lucio

Это моя отправная точка. Моя проблема заключается в том, что мне пришлось использовать отражение в C# однозначно, чтобы поднять свойство getter/setter с аргументами, написанными на VB

Graeme_Grant

Смотрите обновление выше-работает как положено.

Menci Lucio

TestProperty не имеет аргументов. См.

Сообщение государственного имущества(useSQLInfo как boolean?, manageRN как логическое?) в виде строк

в моем источнике в первом посте

Graeme_Grant

См. обновление 2, Тест 3! Специальные функции обертки доступны для C#! :)

Menci Lucio

Класс VB настолько велик, что я не видел предложения intellisense...
Спасибо

Graeme_Grant

Добро пожаловать :)

BillWoodruff

+5 отлично

Graeme_Grant

Спасибо Билл :)

Karthik_Mahalingam

5

Graeme_Grant

Спасибо! :)