Esempio n. 1
0
        private object ResolveField(AssetIdentifier assetIdentifier, Assembly hintAssembly)
        {
            string asset = assetIdentifier.AssetId.Substring(assetIdentifier.TypeMarker.Length + 1);

            int  startIndex = 0;
            Type type       = this.GetDeclaringType(asset, ref startIndex, hintAssembly);

            if (type.IsEnum)
            {
                MemberInfo[] members =
                    type.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance |
                                    BindingFlags.Static);

                foreach (MemberInfo memberInfo in members)
                {
                    AssetIdentifier ret = AssetIdentifier.FromMemberInfo(memberInfo);
                    if (ret.AssetId == assetIdentifier.AssetId)
                    {
                        return(memberInfo);
                    }
                }

                return(null);
            }
            else
            {
                FieldInfo[] allFields =
                    type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static |
                                   BindingFlags.Instance);

                return(allFields.Single(f => Naming.GetAssetId(f).Equals(assetIdentifier.AssetId)));
            }
        }
Esempio n. 2
0
        public IEnumerable <AssetIdentifier> GetAssetHierarchy(AssetIdentifier assetId)
        {
            if (assetId.Type == AssetType.Unknown)
            {
                yield break;
            }

            yield return(assetId);

            switch (assetId.Type)
            {
            case AssetType.Namespace:
                string     ns = (string)this.Resolve(assetId);
                Assembly[] matchingAssemblies =
                    this._assemblyLoader.Where(a => a.GetName().Version == assetId.Version)
                    .Where(a => a.GetTypes().Any(
                               t1 =>
                               t1.Namespace != null &&
                               (StringComparer.Ordinal.Equals(t1.Namespace, ns) ||
                                t1.Namespace.StartsWith(ns + ".", StringComparison.Ordinal))))
                    .ToArray();

                if (matchingAssemblies.Length == 0)
                {
                    throw new InvalidOperationException("Found no assembly containing namespace: " + ns);
                }

                if (matchingAssemblies.Length > 1)
                {
                    TraceSources.AssetResolverSource.TraceWarning(
                        "Namespace {0} found in more than one assembly: {1}",
                        ns,
                        string.Join(", ", matchingAssemblies.Select(a => a.GetName().Name)));
                }
                yield return(AssetIdentifier.FromAssembly(matchingAssemblies[0]));

                break;

            case AssetType.Type:

                Type t = (Type)this.Resolve(assetId);
                while (t.IsNested)
                {
                    t = t.DeclaringType;
                    yield return(AssetIdentifier.FromMemberInfo(t));
                }

                yield return(AssetIdentifier.FromNamespace(t.Namespace, t.Assembly.GetName().Version));

                yield return(AssetIdentifier.FromAssembly(t.Assembly));

                break;

            case AssetType.Method:
            case AssetType.Field:
            case AssetType.Event:
            case AssetType.Property:
                object     resolve = this.Resolve(assetId);
                MemberInfo mi      = (MemberInfo)resolve;

                foreach (
                    AssetIdentifier aid in
                    this.GetAssetHierarchy(AssetIdentifier.FromMemberInfo(mi.ReflectedType)))
                {
                    yield return(aid);
                }


                break;

            case AssetType.Assembly:
                yield break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }