C# 如何查找队列<;双倍>;键入程序集?

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];

我需要反序列化在不同机器上创建的类

这些程序非常相似,但在程序名以及.Net版本等方面存在差异

下面的代码运行得很好,除了我的类中有一个队列。我无法搜索现有组件以找到合适的内容

      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;
        }