SerializationBinder中泛型类型名称的格式

时间:2012-05-07 08:58:21

标签: c# .net generics serialization reflection

如果更改了类型名称,我正在使用SerializationBinder绑定到当前类型。因此,我有一个字典,将旧类型名称绑定到新名称。

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

我可以使用此词典来获取Type BindToType(string assemblyName, string typeName)的{​​{1}}方法中的类型。如果在泛型类型中使用此类型,我还必须找到新类型的泛型。 This answer解释了如何为SerializationBinder执行此操作。我想知道是否存在泛型类型名称的标准化格式,以便我可以使用某种正则表达式来获取所有类型泛型的新类型。

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]] 来检测泛型类型吗?

3 个答案:

答案 0 :(得分:1)

泛型类型的全名包含一个反引号字符(`),后跟一个指定类型参数数量的数字,后跟一个包含每个类型参数的方括号(可能在另一个方括号中)。

所以List<String>就像

一样
  List`1[[String]]

Dictionary<String, Object>喜欢

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

Func<String, Object, Guid>喜欢

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

除了为泛型类型指定了完整名称空间,并为每个类型参数指定了完整的名称空间,程序集,版本,区域性和公钥标记。

另一方面,非泛型类型的全名既不包含后退也不包含方括号。也许你可以写下你的正则表达式吗?

PS!如果您使用oldType.ToString()而不是oldType.FullName,则会得到一个更短的字符串,不包括汇编,文化等。

答案 1 :(得分:0)

据推测,您希望替换对MyClass的所有引用,无论它们是否是其他类的泛型类型参数。

因此,您只需要在类型名称字符串中的任何位置查找类型名称。

如果替换字典中的所有类型名称,则会得到一个新字符串,您可以将其传递给Type.GetType( string typeName )。这会为您提供新的Type实例,您可以从BindToType返回。

当您要替换的类型本身是通用的时,它会变得有点棘手。

答案 2 :(得分:0)

您不需要任何复杂的过程。假设您将反序列化类型名称,如下所示:

System.Collections.Generic.List`1[[Myclass, MyNameSpace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

只需处理AppDomain.AssemblyResolve事件,然后使用上述类型名称调用Type.GetType方法。它将引发该事件,在那里,您可以返回所需的任何程序集。