public Component(string name, Type componentType, bool storeFullVariablesByDefault) { _name = name; _componentType = componentType; _hasTransitionFunction = _componentType.GetMethod("RunTransitionFunction") != null; // Find the type of the state interface by looking at the type of the // second argument of the run method var parametersOfTheRunMethod = componentType.GetMethod("Run").GetParameters(); _stateinterfaceType = parametersOfTheRunMethod[1].ParameterType; _storeFullVariablesByDefault = storeFullVariablesByDefault; var fields = from x in _stateinterfaceType.GetProperties() let isMultDim = x.PropertyType.IsGenericType ? (x.PropertyType.GetGenericTypeDefinition() == typeof(IVariable1Dimensional<,>) || x.PropertyType.GetGenericTypeDefinition() == typeof(IVariable2Dimensional<,,>) || x.PropertyType.GetGenericTypeDefinition() == typeof(IParameter1Dimensional<,>) || x.PropertyType.GetGenericTypeDefinition() == typeof(IParameter2Dimensional<,,>)) : false let dimensionTypes = x.PropertyType.IsGenericType ? x.PropertyType.GetGenericArguments() : null let defaultValuesCount = x.GetCustomAttributes(typeof(DefaultParameterValueAttribute), false).Length select new { Name = x.Name, IsVariable = !isMultDim ? x.CanWrite : (x.PropertyType.GetGenericTypeDefinition() == typeof(IVariable1Dimensional<,>) || x.PropertyType.GetGenericTypeDefinition() == typeof(IVariable2Dimensional<,,>)), DefaultValue = defaultValuesCount == 0 ? null : x.GetCustomAttributes(typeof(DefaultParameterValueAttribute), false).Cast<DefaultParameterValueAttribute>().First(), DimensionTypes = dimensionTypes == null ? new Type[] { } : dimensionTypes.Reverse().Skip(1).Reverse().ToArray(), DataType = !x.PropertyType.IsGenericType ? x.PropertyType : x.PropertyType.GetGenericArguments().Reverse().First() }; foreach (var f in fields) { if (f.IsVariable) { var v = new Variable(f.Name, f.DimensionTypes, f.DataType); v.StoreOutput = _storeFullVariablesByDefault; _variables.Add(f.Name, v); } else { var p = new Parameter(f.Name, f.DimensionTypes, f.DataType); _parameters.Add(f.Name, p); if (f.DefaultValue != null) p.Binding.SetDefaultValue(f.DefaultValue.DefaultValue); } } }
public Component(string name, Type componentType, Type stateinterfaceType) { _name = name; _componentType = componentType; _stateinterfaceType = stateinterfaceType; var fields = from x in stateinterfaceType.GetProperties() let isMultDim = x.PropertyType.IsGenericType ? (x.PropertyType.GetGenericTypeDefinition() == typeof(IVariable1Dimensional<,>) || x.PropertyType.GetGenericTypeDefinition() == typeof(IVariable2Dimensional<,,>) || x.PropertyType.GetGenericTypeDefinition() == typeof(IParameter1Dimensional<,>) || x.PropertyType.GetGenericTypeDefinition() == typeof(IParameter2Dimensional<,,>)) : false let dimensionTypes = x.PropertyType.IsGenericType ? x.PropertyType.GetGenericArguments() : null let defaultValuesCount = x.GetCustomAttributes(typeof(DefaultParameterValueAttribute), false).Length select new { Name = x.Name, IsVariable = !isMultDim ? x.CanWrite : (x.PropertyType.GetGenericTypeDefinition() == typeof(IVariable1Dimensional<,>) || x.PropertyType.GetGenericTypeDefinition() == typeof(IVariable2Dimensional<,,>)), DefaultValue = defaultValuesCount == 0 ? null : x.GetCustomAttributes(typeof(DefaultParameterValueAttribute), false).Cast<DefaultParameterValueAttribute>().First(), DimensionTypes = dimensionTypes == null ? new Type[] { } : dimensionTypes.Reverse().Skip(1).Reverse().ToArray(), DataType = !x.PropertyType.IsGenericType ? x.PropertyType : x.PropertyType.GetGenericArguments().Reverse().First() }; foreach (var f in fields) { if (f.IsVariable) { var v = new Variable(f.Name, f.DimensionTypes, f.DataType); _variables.Add(f.Name, v); } else { var p = new Parameter(f.Name, f.DimensionTypes, f.DataType); _parameters.Add(f.Name, p); if (f.DefaultValue != null) p.Binding.SetDefaultValue(f.DefaultValue.DefaultValue); } } }