2012-05-07 59 views
0

我使用SerializationBinder在類型名稱更改的情況下綁定到當前類型。因此,我有一個將舊類型名稱綁定到新名稱的字典。通用類型名稱的格式SerializationBinder

dict.Add("Old.Namespace.OldTypeName", "New.Namespace.NewName"); 

我可以用這個字典來獲取類型的SerializationBinderType BindToType(string assemblyName, string typeName)方法。如果這種類型在泛型中使用,我還必須找到新類型的泛型。 This answer解釋瞭如何爲List<T>做到這一點。我想知道是否有一個通用類型名稱的標準格式,以便我可以使用某種正則表達式來獲取所有類型的新類型。

public class TypeDictionary 
{ 
    private Dictionary<string, Type> bindings_ = 
     new Dictionary<string, Type>(); 

    public void AddBinding(string oldTypeString, Type newType) 
    { 
     bindings_.Add(oldTypeString, newType); 
    } 

    public Type NewType(string oldTypeString) 
    { 
     // How should this be implemented: 
     if (IsGeneric(oldTypeString)) 
      return NewGenericType(oldTypeString); 

     Type newType; 
     if (bindings_.TryGetValue(oldTypeString, out newType)) 
      return newType; 
     return null; 
    } 
} 

到目前爲止,我所看到的大多數字符串爲List<T>這樣

Namespace.TypeName`1[[MyAssembly.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 

是將它保存到只是看"[[MyAssembly.MyClass,"檢測泛型類型?

回答

1

泛型類型的全名包含反引號字符(`),後跟一個數字,指定類型參數的數目,後跟包含每個類型參數的方括號(可能位於附加的方括號內)。

所以List<String>是這樣寫

List`1[[String]] 

Dictionary<String, Object>

Dictionary`2[[String],[Object]] 

Func<String, Object, Guid>

Func`3[[String],[Object],[Guid]] 

除了完整的命名空間是爲通用型給出的,完整的命名空間,彙編,版本,文化,和公鑰標記是爲每個類型參數給出的。

另一方面,非泛型類型的全名既不包含backtricks也不包含方括號。也許你可以寫出你的正則表達式?

PS!如果你使用oldType.ToString()而不是oldType.FullName,你會得到一個稍微短一點的字符串,不包括彙編,文化等。

+0

這是我在大多數類型中看到的,但是後來我得到了這個:'System.Collections。ObjectModel.ObservableCollection \'1 + SimpleMonitor [[MyNS.MyClass,MyAssembly,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'。你知道這個'SimpleMonitor'部件是什麼嗎? – hansmaad

+0

這是一個嵌套類型。這意味着在另一個類型中定義的類型,就像你做了'class ObservableCollection {public class SimpleMonitor {}}'。所以「加號」意味着嵌套類型。 –

0

假設您想要替換MyClass的所有引用,無論它們是否是其他類的泛型類型參數。

因此,您只需要在類型名稱字符串中的任意位置查找您的類型名稱。

如果您替換字典中的所有類型名稱,則會得到一個新字符串,您可以將其傳遞給Type.GetType(string typeName)。這給你新的Type實例,你可以從BindToType返回。

當你正在替換的類型本身是通用的時,它會變得有點棘手。

+0

簡單的替換是我的第一次嘗試,但如果有一個'MyClassCalculator'就會變得困難。也許我應該試着用'[MyNewClass'替換'MyClass',如果沒有完全匹配的話。 – hansmaad