在vb.net中创建并使用扩展
本文关键字:扩展 创建 vb net | 更新日期: 2023-09-27 18:29:50
这个问题有两个部分:
- 如何让扩展在vb.net中工作
- 如何在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的答案一起使用将如预期的那样起作用。
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)