VB.NET - 如何在泛型类型的实例上调用实例函数委托?

时间:2010-08-04 05:08:59

标签: vb.net

D是一个字典,其条目值为Type T

我正在尝试做的是在下面有一个类似“Serializer”的委托,我可以在T的实例上调用,例如下面的“Entry.Value”。

请参阅下面的“返回条目...”一行,我的一厢情愿。

这可能吗?

如果是这样,这是个坏主意吗?

Public Delegate Function Serializer(Of T)() As Byte()

Function SerializeDictionary_String_Object(Of T)(ByRef D As Dictionary(Of String, T), ByVal ObjSerializer As Serializer(Of T)) As Byte()

  for each Entry in D
    return Entry.Value.ObjSerializer()
    exit for
  next

End Function

2 个答案:

答案 0 :(得分:2)

在您的Serializer委托中,您没有在任何地方使用T.你应该这样做:

Public Delegate Function Serializer(Of T)(Byval obj As T) As Byte()

或者更好的是,只需使用内置的Func委托。

Function SerializeDictionary_String_Object(Of T)(ByRef D As Dictionary(Of String, T), ByVal ObjSerializer As Func(Of T, Byte()) As Byte()

然后通过执行以下操作来调用它:

ObjSerializer(Entry.Value)

我在VB非常生疏,所以如果我错过了下划线或其他什么,我很抱歉。 :)

答案 1 :(得分:1)

也许像那样的扩展方法?

Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.CompilerServices

Public Module ModuleTupExtension
    <Extension()> _
    Public Function DeepClone(Of T)(ByVal a As T) As T
        Using stream As New MemoryStream()
            Dim formatter As New BinaryFormatter()
            formatter.Serialize(stream, a)
            stream.Position = 0
            Return DirectCast(formatter.Deserialize(stream), T)
        End Using
    End Function

    <Extension()> _
    Public Function toSerializedByteArray(Of T)(ByVal a As T) As Byte()
        Using stream As New MemoryStream()
            Dim formatter As New BinaryFormatter()
            formatter.Serialize(stream, a)
            stream.Position = 0
            Return stream.ToArray()
        End Using
    End Function
End Module

我离开了深层克隆,因为我是从那个那里做的。 仅适用于标记为&lt;可序列化&gt;虽然。

另外,我没有在真正的大对象或递归对象上尝试过它。

干杯!