Как найти тип Queue <Double>в сборках? - PullRequest
0 голосов
/ 07 октября 2019

Мне нужно десериализовать классы, созданные на разных машинах.

Программы очень похожи, но имеют различия в названии программы, а также в версии .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;
        }

РЕДАКТИРОВАТЬ 1

Это то, из чего я должен создать поиск:

typeName = "System.Collections.Generic.Queue`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"

1 Ответ

0 голосов
/ 07 октября 2019

У моих собственных классов, как представляется, есть typeName, которое содержит "+", например:

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

Я отправил этот ответ на случай, если у кого-то еще возникли подобные проблемы.

...