コード例 #1
0
        private static Type CreateRecoveryQualifiedName(string simplifyQualifiedName)
        {
            StringBuilder builder = new StringBuilder();

            RecoveryQualifiedName(simplifyQualifiedName, ref builder);
            return(AssemblyInfoCollection.GetTypeFromQualifiedName(builder.ToString()));
        }
コード例 #2
0
        public static Type GetTypeFromQualifiedName(string assemblyQualifiedName)
        {
            int    index        = TypeNameIndex(assemblyQualifiedName);
            var    typeName     = assemblyQualifiedName.Substring(0, index);
            string assemblyName = assemblyQualifiedName.Substring(index + 2);

            return(AssemblyInfoCollection.TryCreate(assemblyName).Assembly.GetType(typeName));
        }
コード例 #3
0
        private static void RecoveryQualifiedName(string simplifyQualifiedName, ref StringBuilder builder)
        {
            int builderIndex = builder.Length;

            int    depth        = 0;
            int    index        = 0;
            int    firstIndex   = -1;
            string assemblyName = string.Empty;

            for (int i = 0; i < simplifyQualifiedName.Length;)
            {
                var c = simplifyQualifiedName[i];
                switch (c)
                {
                case '[':
                    if (firstIndex == -1)
                    {
                        firstIndex = i;
                    }
                    if (depth == 0)
                    {
                        builder.Append('[');
                        index = i + 1;
                    }
                    depth++;
                    break;

                case ']':
                    depth--;
                    if (depth == 1)
                    {
                        string str = simplifyQualifiedName.Substring(index + 1, i - index - 1);

                        builder.Append('[');
                        //builder.Append();
                        RecoveryQualifiedName(str, ref builder);
                        index = i + 2;
                    }
                    if (depth < 2)
                    {
                        builder.Append(']');
                    }
                    break;

                case ',':
                    if (firstIndex == -1)
                    {
                        firstIndex = i;
                    }
                    if (depth == 0)
                    {
                        assemblyName = simplifyQualifiedName.Substring(i + 1);
                        i            = simplifyQualifiedName.Length;
                    }
                    else if (depth < 2)
                    {
                        builder.Append(',');
                    }
                    break;

                default:
                    if (depth == 0)
                    {
                        builder.Append(c);
                    }
                    break;
                }
                i++;
            }
            if (string.IsNullOrWhiteSpace(assemblyName))
            {
                assemblyName = "mscorlib";
            }

            string typeName = firstIndex == -1 ? simplifyQualifiedName : simplifyQualifiedName.Substring(0, firstIndex);
            var    nsIndex  = typeName.LastIndexOf('.');

            if (nsIndex > -1)
            {
                var ns = typeName.Substring(0, nsIndex);
                builder.Remove(builderIndex, nsIndex);
                builder.Insert(builderIndex, GetNamespace(ns));
            }
            var assembly = AssemblyInfoCollection.Find(assemblyName);

            builder.Append(", ");
            //TODO:如果找不到程序集,是否需要延迟加载?
            if (assembly == null)
            {
                var type = AutoMappingTypes.GetOrAdd(typeName, ObjectFactory.GetType);
                if (type == null)
                {
                    throw new TypeLoadException("找不到类型 {0} 的程序集。".Fmt(typeName));
                }
                builder.Append(type.Assembly.FullName);
            }
            else
            {
                builder.Append(assembly.Fullname);
            }
        }