如果更改了类型名称,我正在使用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]]
来检测泛型类型吗?
答案 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
方法。它将引发该事件,在那里,您可以返回所需的任何程序集。