VB.NET - 如何在泛型类型的实例上调用实例函数委托?
问题描述:
D是一个字典,其输入值为T型VB.NET - 如何在泛型类型的实例上调用实例函数委托?
我在试图做的是有一个像“Serializer”一样的代理,可以在T的实例上调用,比如“Entry.Value”下面。
请参阅下面的“return Entry ...”一行,以便我的一厢情愿。
这可能吗?
如果是这样,这是一个坏主意吗?
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
答
在你的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非常生疏如果是的话我道歉我错过了一个下划线或东西。 :)
答
也许这样的扩展方法?
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
我离开了这个deepclone,因为我从那个那里做了。 只能在标记为< Serializable>的对象上工作。
此外,我还没有尝试过真正的大对象或递归。
干杯!
您示例中的ObjSerializer是一个共享(或静态)函数。我需要它是一个实例功能。如果我被迫使用共享函数,那么我将不得不拥有每个序列化函数的共享和实例版本。 – 2010-08-04 14:23:10
我不确定VB语法是什么,但在C#中,您可以使用lambda来实现此目的:SerializeDictionary_String_Object(dict,x => x.Serialize()) - 上面的方法签名不需要更改。 – Josh 2010-08-04 15:44:48