/// <summary> /// Sets configuration values. In .Net it sets the properties, in case of java it invokes set methods (since java does not have properties). /// </summary> private void SetConfiguration() { if (m_metadata.ComponentMetadataDefinition.ConfigurationType != null) { try { if (m_metadata.ComponentMetadataDefinition.ConfigurationWrapperDefinition.IsJava == false) { PropertyInfo[] properties = LoadedComponent.Configuration.GetType().GetProperties(); foreach (PropertyInfo property in properties) { object value = m_metadata.ConfigWrapper.ConfigValues[property.Name].Value; if (value != null) { var converter = System.ComponentModel.TypeDescriptor.GetConverter(value); //in mono TypeDescriptor.GetConverter(value) does not return EnumValueTypeConverter for EnumValueCollection, //it returns just simply TypeConverter and that causes experiment to fail with any component that has any enum values if (RuntimeInfo.IsRunInMono) { var enumValueCollection = value as EnumValueCollection; if (enumValueCollection != null) { converter = new EnumValueTypeConverter(enumValueCollection); } } if (value.GetType().Equals(property.PropertyType) || property.PropertyType.IsAssignableFrom(value.GetType())) { property.SetValue(LoadedComponent.Configuration, value, null); } else if (converter != null && converter.CanConvertTo(property.PropertyType)) { property.SetValue(LoadedComponent.Configuration, converter.ConvertTo(value, property.PropertyType), null); } else { throw new ArgumentException( string.Format("Unable to convert Configuration value's type {0} to {1}", value.GetType(), property.PropertyType)); } } } } else { //for java foreach (string propertyName in m_metadata.ConfigWrapper.ConfigValues.Keys) { String setterPrefix = "set"; MethodInfo method = LoadedComponent.Configuration.GetType().GetMethod(setterPrefix + propertyName); if (method != null) { method.Invoke(LoadedComponent.Configuration, new object[] { m_metadata.ConfigWrapper.ConfigValues[propertyName].Value }); } } } } catch (TargetInvocationException ex) { //it catches target invocation exception and rethrows inner exception, that we could show user actual message from component exception throw ex.InnerException; } } }
/// <summary> /// Sets configuration values. In .Net it sets the properties, in case of java it invokes set methods (since java does not have properties). /// </summary> private void SetConfiguration() { if (m_metadata.ComponentMetadataDefinition.ConfigurationType != null) { try { if (m_metadata.ComponentMetadataDefinition.ConfigurationWrapperDefinition.IsJava == false) { PropertyInfo[] properties = LoadedComponent.Configuration.GetType().GetProperties(); foreach (PropertyInfo property in properties) { object value = m_metadata.ConfigWrapper.ConfigValues[property.Name].Value; if (value != null) { var converter = System.ComponentModel.TypeDescriptor.GetConverter(value); //in mono TypeDescriptor.GetConverter(value) does not return EnumValueTypeConverter for EnumValueCollection, //it returns just simply TypeConverter and that causes experiment to fail with any component that has any enum values if (RuntimeInfo.IsRunInMono) { var enumValueCollection = value as EnumValueCollection; if (enumValueCollection != null) { converter = new EnumValueTypeConverter(enumValueCollection); } } if (value.GetType().Equals(property.PropertyType) || property.PropertyType.IsAssignableFrom(value.GetType())) { property.SetValue(LoadedComponent.Configuration, value, null); } else if (converter != null && converter.CanConvertTo(property.PropertyType)) { property.SetValue(LoadedComponent.Configuration, converter.ConvertTo(value, property.PropertyType), null); } else { throw new ArgumentException( string.Format("Unable to convert Configuration value's type {0} to {1}", value.GetType(), property.PropertyType)); } } } } else { //for java foreach (string propertyName in m_metadata.ConfigWrapper.ConfigValues.Keys) { String setterPrefix = "set"; MethodInfo method = LoadedComponent.Configuration.GetType().GetMethod(setterPrefix + propertyName); if (method != null) { method.Invoke(LoadedComponent.Configuration, new object[] { m_metadata.ConfigWrapper.ConfigValues[propertyName].Value }); } } } } catch (TargetInvocationException ex) { //it catches target invocation exception and rethrows inner exception, that we could show user actual message from component exception throw ex.InnerException; } } }