public static IEnumerable <GuerillaBlock> Children(this GuerillaBlock guerillaBlock) { var blockType = guerillaBlock.GetType( ); if (!FieldInfoDictionary.ContainsKey(blockType)) { FieldInfoDictionary[blockType] = blockType.Fields(null).ToArray( ); } var fields = FieldInfoDictionary[blockType]; foreach (var fieldInfo in fields) { if (IsGuerillaBlockStruct(fieldInfo)) { if (!Accessors.ContainsKey(fieldInfo)) { Accessors[fieldInfo] = fieldInfo.DelegateForGetFieldValue( ); } var block = ( GuerillaBlock )Accessors[fieldInfo].Invoke(guerillaBlock); yield return(block); foreach (var child in block.Children( )) { yield return(child); } } if (IsGuerillaBlockArray(fieldInfo)) { if (!Accessors.ContainsKey(fieldInfo)) { Accessors[fieldInfo] = fieldInfo.DelegateForGetFieldValue(); } var elements = (GuerillaBlock[])Accessors[fieldInfo].Invoke(guerillaBlock); foreach (var element in elements) { yield return(element); foreach (var child in element.Children( )) { yield return(child); } } } } }
public static IEnumerable <TagReference> GetReferences(this GuerillaBlock guerillaBlock) { var fields = guerillaBlock.GetType( ).GetRuntimeFields( ); foreach (var fieldInfo in fields) { if (IsReference(fieldInfo)) { yield return((TagReference)fieldInfo.Get(guerillaBlock)); } if (IsIdent(fieldInfo)) { yield return(new TagReference(TagClass.Empty, (TagIdent)fieldInfo.Get(guerillaBlock))); } if (IsGuerillaBlockStruct(fieldInfo)) { foreach (var reference in GetReferences(( GuerillaBlock )fieldInfo.Get(guerillaBlock))) { yield return(reference); } } if (IsGuerillaBlockArray(fieldInfo)) { var elements = ( GuerillaBlock[] )fieldInfo.Get(guerillaBlock); foreach (var element in elements) { foreach (var reference in GetReferences(element)) { yield return(reference); } } } } }
public static TagClass?GetTagClass(this GuerillaBlock guerillaBlock) { var customAttribute = (TagClassAttribute)guerillaBlock.GetType( ).GetCustomAttribute(typeof(TagClassAttribute)); return(customAttribute.TagClass); }