C# 如何查找队列<;双倍>;键入程序集?
我需要反序列化在不同机器上创建的类 这些程序非常相似,但在程序名以及.Net版本等方面存在差异 下面的代码运行得很好,除了我的类中有一个队列。我无法搜索现有组件以找到合适的内容C# 如何查找队列<;双倍>;键入程序集?,c#,.net-assembly,system.reflection,C#,.net Assembly,System.reflection,我需要反序列化在不同机器上创建的类 这些程序非常相似,但在程序名以及.Net版本等方面存在差异 下面的代码运行得很好,除了我的类中有一个队列。我无法搜索现有组件以找到合适的内容 public override Type BindToType(string assemblyName, string typeName) { string typeSearchString;// = typeName.Split('+')[1];
public override Type BindToType(string assemblyName, string typeName)
{
string typeSearchString;// = typeName.Split('+')[1];
try
{
typeSearchString = typeName.Split('+')[1];
}
catch
{
var parts = typeName.Split(new string[] { "[[" }, StringSplitOptions.RemoveEmptyEntries)[1].Split(',');
typeSearchString = @"System.Collections.Generic.Queue"; //This does NOT find Queue<Double> but it does find something else which gives an error
}
Type tyType = null;
string sShortAssemblyName = assemblyName.Split(',')[0];
System.Reflection.Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (System.Reflection.Assembly ayAssembly in ayAssemblies)
{
foreach (Type type in ayAssembly.GetTypes())
{
if (type.FullName.Contains(typeSearchString))
{
tyType = ayAssembly.GetType(type.FullName);
return tyType;
}
}
}
return tyType;
}
我自己的类似乎有一个包含“+”的类型名,例如: “MyNameSpace.MyDocName+MyClass” 我已经能够使用它来确定在何处查找类型:
public override Type BindToType(string assemblyName, string typeName)
{
Type tyType = null;
string sShortAssemblyName = assemblyName.Split(',')[0];
System.Reflection.Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
string typeSearchString;
try
{
typeSearchString = typeName.Split('+')[1];
foreach (System.Reflection.Assembly ayAssembly in ayAssemblies)
{
foreach (Type type in ayAssembly.GetTypes())
{
if (type.FullName.Contains(typeSearchString))
{
tyType = ayAssembly.GetType(type.FullName);
return tyType;
}
}
}
}
catch
{
foreach (System.Reflection.Assembly ayAssembly in ayAssemblies)
{
if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0])
{
tyType = ayAssembly.GetType(typeName);
return tyType;
}
}
}
return tyType;
}
我已经发布了这个答案,以防其他人有类似的问题。如果你的内存中有程序集,
typeof(Queue)
对你有用吗?为什么需要使用反射找到它,我们缺少什么?请参见编辑1。这个字符串是我所有的信息,我不是在现实生活中硬编码这个-只是举个例子here@ManInMoon这似乎是一个错误。目前的问题也不完整,因此不清楚。阅读并编辑问题,提供一个可用于重现问题的答案,以便更好地理解所问的问题。你为什么要实现自己的序列化?难道没有一个能满足您的数百个可用需求吗?在任何程序集中都没有队列类型;只有队列
(对于一个通用参数,CLR名称队列'1
)。可以通过调用.GetGenericTypeDefinition()
从任意队列中获取它。如果您只有一个名称,那么解析会让事情变得更复杂(正如您所发现的)。具体的队列
在实例化之前是不存在的——这也可以在运行时完成(使用.MakeGenericType()
),但现在还不清楚这正是您需要的。这解决了您查找队列类型的问题吗?在某种程度上,是的。我现在不再查找类型,而是查找标准类型的程序集名称。如果程序集已加载,则type.GetType(string)
是否有效?如果程序集详细信息(如版本或PublicKeyToken)不同,则不起作用。
public override Type BindToType(string assemblyName, string typeName)
{
Type tyType = null;
string sShortAssemblyName = assemblyName.Split(',')[0];
System.Reflection.Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
string typeSearchString;
try
{
typeSearchString = typeName.Split('+')[1];
foreach (System.Reflection.Assembly ayAssembly in ayAssemblies)
{
foreach (Type type in ayAssembly.GetTypes())
{
if (type.FullName.Contains(typeSearchString))
{
tyType = ayAssembly.GetType(type.FullName);
return tyType;
}
}
}
}
catch
{
foreach (System.Reflection.Assembly ayAssembly in ayAssemblies)
{
if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0])
{
tyType = ayAssembly.GetType(typeName);
return tyType;
}
}
}
return tyType;
}