internal static void CollectNodeInfo(Type type) { if (!NODE_INFO.ContainsKey(type)) { MyNodeInfo nodeInfo = new MyNodeInfo(); nodeInfo.Attributes = type.GetCustomAttribute <MyNodeInfoAttribute>(true); if (nodeInfo.Attributes == null) { nodeInfo.Attributes = new MyNodeInfoAttribute(); } foreach (PropertyInfo pInfo in type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { if (typeof(MyTask).IsAssignableFrom(pInfo.PropertyType)) { nodeInfo.KnownTasks.Add(pInfo.Name, pInfo); nodeInfo.TaskOrder.Add(pInfo); MyTaskGroupAttribute groupAttr = pInfo.GetCustomAttribute <MyTaskGroupAttribute>(true); if (groupAttr != null) { if (!nodeInfo.TaskGroups.ContainsKey(groupAttr.Name)) { nodeInfo.TaskGroups[groupAttr.Name] = new List <PropertyInfo>(); } nodeInfo.TaskGroups[groupAttr.Name].Add(pInfo); } } else if (typeof(MyAbstractMemoryBlock).IsAssignableFrom(pInfo.PropertyType)) { MyInputBlockAttribute inAttr = pInfo.GetCustomAttribute <MyInputBlockAttribute>(true); if (inAttr != null) { nodeInfo.InputBlocks.Add(pInfo); } else { if (typeof(MyWorkingNode).IsAssignableFrom(type)) { nodeInfo.OwnedMemoryBlocks.Add(pInfo); } if (pInfo.GetCustomAttribute <MyOutputBlockAttribute>(true) != null) { nodeInfo.OutputBlocks.Add(pInfo); } } } else if (typeof(MySignal).IsAssignableFrom(pInfo.PropertyType)) { nodeInfo.RegisteredSignals.Add(pInfo); } object defaultValue = pInfo.GetAttributeProperty((YAXSerializableFieldAttribute fa) => fa.DefaultValue); if (defaultValue != null) { nodeInfo.InitiableProperties.Add(pInfo); } } nodeInfo.InputBlocks = new List <PropertyInfo>( nodeInfo.InputBlocks.OrderBy(x => x.GetCustomAttribute <MyInputBlockAttribute>(true).Order)); nodeInfo.OutputBlocks = new List <PropertyInfo>( nodeInfo.OutputBlocks.OrderBy(x => x.GetCustomAttribute <MyOutputBlockAttribute>(true).Order)); nodeInfo.TaskOrder = new List <PropertyInfo>( nodeInfo.TaskOrder.OrderBy(x => (x.GetCustomAttribute <MyTaskInfoAttribute>(true) != null ? x.GetCustomAttribute <MyTaskInfoAttribute>(true).Order : 0))); NODE_INFO[type] = nodeInfo; } }
internal static void CollectNodeInfo(Type type) { if (NODE_INFO.ContainsKey(type)) { return; } var nodeInfo = new MyNodeInfo { Attributes = type.GetCustomAttribute <MyNodeInfoAttribute>(true) ?? new MyNodeInfoAttribute() }; foreach (PropertyInfo pInfo in type.GetProperties( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { if (typeof(MyTask).IsAssignableFrom(pInfo.PropertyType)) { nodeInfo.KnownTasks.Add(pInfo.Name, pInfo); nodeInfo.OrderedTasks.Add(pInfo); MyTaskGroupAttribute groupAttr = pInfo.GetCustomAttribute <MyTaskGroupAttribute>(true); if (groupAttr != null) { if (!nodeInfo.TaskGroups.ContainsKey(groupAttr.Name)) { nodeInfo.TaskGroups[groupAttr.Name] = new List <PropertyInfo>(); } nodeInfo.TaskGroups[groupAttr.Name].Add(pInfo); } } else if (typeof(MyAbstractMemoryBlock).IsAssignableFrom(pInfo.PropertyType)) { MyInputBlockAttribute inAttr = pInfo.GetCustomAttribute <MyInputBlockAttribute>(true); if (inAttr != null) { nodeInfo.InputBlocks.Add(pInfo); } else { if (typeof(MyWorkingNode).IsAssignableFrom(type)) { nodeInfo.OwnedMemoryBlocks.Add(pInfo); } if (IsOutputMemoryBlock(pInfo)) { nodeInfo.OutputBlocks.Add(pInfo); } } } else if (typeof(IMemBlockOwner).IsAssignableFrom(pInfo.PropertyType)) { CollectNestedMemBlocks(nodeInfo, pInfo); } else if (typeof(MySignal).IsAssignableFrom(pInfo.PropertyType)) { nodeInfo.RegisteredSignals.Add(pInfo); } object defaultValue = pInfo.GetAttributeProperty((YAXSerializableFieldAttribute fa) => fa.DefaultValue); if (defaultValue != null) { nodeInfo.InitiableProperties.Add(pInfo); } } nodeInfo.InputBlocks = new List <PropertyInfo>( nodeInfo.InputBlocks.OrderBy(p => p.GetCustomAttribute <MyBlockOrderAttribute>(true).Order)); nodeInfo.OutputBlocks = new List <PropertyInfo>( nodeInfo.OutputBlocks.OrderBy(p => p.GetCustomAttribute <MyBlockOrderAttribute>(true).Order)); nodeInfo.OrderedTasks = new List <PropertyInfo>( nodeInfo.OrderedTasks.OrderBy( // check pInfo.PropertyType because MyTaskInfo is a class attribute not property attribute p => p.PropertyType.GetCustomAttribute <MyTaskInfoAttribute>(true)?.Order ?? 0)); NODE_INFO[type] = nodeInfo; }