2010-08-04 59 views
0

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 

回答

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非常生疏如果是的话我道歉我错过了一个下划线或东西。 :)

+0

您示例中的ObjSerializer是一个共享(或静态)函数。我需要它是一个实例功能。如果我被迫使用共享函数,那么我将不得不拥有每个序列化函数的共享和实例版本。 – 2010-08-04 14:23:10

+0

我不确定VB语法是什么,但在C#中,您可以使用lambda来实现此目的:SerializeDictionary_String_Object(dict,x => x.Serialize()) - 上面的方法签名不需要更改。 – Josh 2010-08-04 15:44:48

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 

我离开了这个deepclone,因为我从那个那里做了。 只能在标记为< Serializable>的对象上工作。

此外,我还没有尝试过真正的大对象或递归。

干杯!