Создать и использовать расширение в vb.net

1

У меня есть две части этого вопроса:

  1. Как получить расширение для работы в vb.net
  2. Как вызвать выражение лямбды в vb.net

Я хочу реализовать расширение в VB.NET, и хотя я использовал их много раз в С#; Я не понимаю, почему это не сработает для меня.

Вот одно из расширений, которое мне нужно вызвать в С#

public static class EnumerableExtensions
{
    public static string ToSeparator<T, TU>(this IEnumerable<T> source, 
    Func<T, TU> func, string separator, bool endWithSeparator)
    {
        string separatedString = string.Join(separator, source.Select(x =>
        {
            var value = func(x);
            return value == null ? string.Empty : value.ToString();
        }));

        separatedString += (endWithSeparator ? separator : string.Empty);

        return separatedString;
    }
}

Я конвертировал в vb.net (используя DeveloperFusion), поэтому я не уверен, насколько точно это в первую очередь, поскольку мне пришлось внести несколько изменений вручную:

Imports System.Linq
Imports System.Runtime.CompilerServices

Namespace [Shared].Extensions

  Module IEnumerableExtensions

    <Extension()> _
    Public Function ToSeparator(Of T, TU)(source As IEnumerable(Of T), 
    func As Func(Of T, TU), separator As String, endWithSeparator As Boolean) 
    As String

      Dim separatedString As String = String.Join(separator, source.Select(
      Function(x)
        Return If(x Is Nothing, String.Empty, x.ToString())
      End Function))

      separatedString += (If(endWithSeparator, separator, String.Empty))

      Return separatedString

    End Function

  End Module

End Namespace

Это создается в отдельной сборке на С#, и при вызове этого метода он отлично работает:

var list = mylist.ToSeparator(m=>m.LastName, ",", false);

но в vb.net он просто не появится в intellisense,

2) Я не уверен, как назвать часть функции m=>m.Lastname в vb.net

К сожалению, моя общая библиотека также написана на vb.net, поэтому я не могу оправдать создание отдельной сборки в С# для этих нескольких расширений, которые мне нужны, поэтому мне действительно нужно это решить в VB.NET

Я что-то делаю неправильно? Любые идеи, почему он не будет отображаться в intellisense в vb.net, как это происходит в С#?

Я использую.NET 4.0 и VS 2013.

Благодарю.

ОБНОВИТЬ

Ниже приведено обновленное расширение, которое правильно преобразовано в VB.NET. Я думал, что обновляю его, поскольку это может быть полезно кому-то другому.

<Extension()> _
Public Function ToSeparator(Of T, TU)(source As IEnumerable(Of T), 
func As Func(Of T, TU), separator As String, endWithSeparator As Boolean) As String

  Dim separatedString As String = String.Join(separator, source.[Select](
    Function(x)
      Dim value As TU = func(x)
      Return If(value Is Nothing, String.Empty, value.ToString())
    End Function))

  separatedString += (If(endWithSeparator, separator, String.Empty))

  Return separatedString

End Function

Использование этого с ответом @DStanley будет работать так, как ожидалось.

  • 2
    Было бы лучше, если бы вы разделили свой общий вопрос на две части. Гораздо проще ответить на один конкретный вопрос, чем на два разных вопроса. Также стоит понимать, что в вашем VB-коде нет лямбда-выражения - у вас есть делегат. Так что, если вы исследуете вызов делегатов в VB (или вызываете их), это вполне может ответить на вашу вторую часть ...
  • 0
    @JonSkeet спасибо за совет. Я буду помнить это в следующий раз.
Теги:
extension-methods

1 ответ

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

1) в vb.net, он просто не появится в intellisense,

Возможно, вам просто нужно сделать свой Module общедоступным. Модули VB являются Friend по умолчанию (примерно эквивалентно С# internal:

Public Module IEnumerableExtensions

2) Я не уверен, как назвать часть функции m => m.Lastname в vb.net

Быстрый поиск "VB Lambda" привел бы много примеров:

list = mylist.ToSeparator(Function(m) m.LastName, ",", False)
  • 0
    Привет, спасибо за это! Я не могу поверить, что это было так просто, как сделать модуль Public !! Почувствуй себя полным новичком здесь !! Что касается функции, вы правы, я просто подумал, что я также добавлю ее в вопрос, поскольку она была связана, но да, множество примеров в порядке. Спасибо, что нашли время ответить на оба.
  • 0
    У меня есть только шанс полностью протестировать это сейчас и, как ни странно, list = mylist.ToSeparator (Function (m) m.LastName, ",", False) не работает должным образом. Может быть, моя настоящая функция не переведена должным образом. Я обновлю ответ, когда найду решение, или я опубликую новый вопрос, если снова буду бороться. Очень странно, но, надеюсь, я почти у цели.
Показать ещё 1 комментарий

Ещё вопросы

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