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