У меня есть две части этого вопроса:
Я хочу реализовать расширение в 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 будет работать так, как ожидалось.
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)