在vb.net中创建并使用扩展

本文关键字:扩展 创建 vb net | 更新日期: 2023-09-27 18:29:50

这个问题有两个部分:

  1. 如何让扩展在vb.net中工作
  2. 如何在vb.net中调用lambda表达式

我想在VB.NET中实现一个扩展,虽然我在C#中已经使用了很多次;我不明白为什么这对我不起作用。

这是我需要在C#中调用的一个扩展

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

这是在C#中的一个单独的程序集中创建的,当以这种方式调用时,它工作得很好:

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

但在vb.net中,它不会出现在intellisense、中

2) 我不知道如何在vb.net 中调用函数m=>m.Lastname的部分

不幸的是,我的共享库也是用vb.net编写的,所以我无法证明在c#中创建一个单独的程序集来满足我需要的几个扩展,所以我真的需要在vb.net 中解决这个问题

我做错什么了吗?有什么想法吗?为什么它不会像在c#中那样出现在vb.net的intellisense中?

我使用的是.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的答案一起使用将如预期的那样起作用。

在vb.net中创建并使用扩展

1) 在vb.net中,它不会出现在intellisense、中

您可能只需要公开您的Module。VB模块默认为Friend(大致相当于C#的internal:

Public Module IEnumerableExtensions

2) 我不知道如何调用函数m=>m的部分。在vb.net 中的Lastname

快速搜索"VB Lambda"会得到很多例子:

list = mylist.ToSeparator(Function(m) m.LastName, ",", False)