2010-08-04 58 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>的對象上工作。

此外,我還沒有嘗試過真正的大對象或遞歸。

乾杯!