public ClassMemberValueInitializer([NotNull] IConfigurationFileElement configurationFileElement, [NotNull] IClassMemberValueInitializerHelper classMemberValueInitializerHelper, [NotNull] ClassMemberData classMemberData) { _configurationFileElement = configurationFileElement; _classMemberValueInitializerHelper = classMemberValueInitializerHelper; ClassMemberData = classMemberData; }
public string GenerateValueCSharp(ClassMemberData classMemberData, IDynamicAssemblyBuilder dynamicAssemblyBuilder) { var valueCSharpStrBldr = new StringBuilder(); if (classMemberData.IsInjectedClassMember) { var dynamicallyGeneratedClass = dynamicAssemblyBuilder.GetDynamicallyGeneratedClass(DynamicCodeGenerationHelpers.ClassMembersClassName); if (!_injectedTypesToVariableNameCSharpFile.TryGetValue(classMemberData.ClassInfo.Type, out var variableName)) { variableName = $"{classMemberData.ClassInfo.Type.Name}_{GlobalsCoreAmbientContext.Context.GenerateUniqueId()}"; _injectedTypesToVariableNameCSharpFile[classMemberData.ClassInfo.Type] = variableName; var variableInitializationCode = new StringBuilder(); variableInitializationCode.AppendFormat("public static {0} {1}=", classMemberData.ClassInfo.TypeCSharpFullName, variableName); #pragma warning disable CS0612, CS0618 variableInitializationCode.Append($"{typeof(DiContainerBuilderConfiguration).FullName}.{nameof(DiContainerBuilderConfiguration.DiContainerStatic)}.{nameof(IDiContainer.Resolve)}"); #pragma warning restore CS0612, CS0618 variableInitializationCode.Append($"<{classMemberData.ClassInfo.TypeCSharpFullName}>();"); dynamicallyGeneratedClass.AddCodeLine(variableInitializationCode.ToString()); } valueCSharpStrBldr.Append($"{dynamicallyGeneratedClass.ClassFullName}.{variableName}"); } else { valueCSharpStrBldr.Append($"{classMemberData.ClassInfo.TypeCSharpFullName}"); } // Add class member name valueCSharpStrBldr.Append($".{classMemberData.ClassMemberInfo.Name}"); if (classMemberData.ClassMemberCategory == ClassMemberCategory.Method) { valueCSharpStrBldr.Append("("); valueCSharpStrBldr.Append(string.Join(",", classMemberData.Parameters.Select(x => x.GenerateValueCSharp(dynamicAssemblyBuilder)))); valueCSharpStrBldr.Append(")"); } return(valueCSharpStrBldr.ToString()); }
protected override ITypeInfo GetValueTypeInfo() { var classInfo = TypeHelper.GetTypeInfo(this, ConfigurationFileAttributeNames.DeclaringClass, ConfigurationFileAttributeNames.Assembly, ConfigurationFileAttributeNames.DeclaringClassRef); IEnumerable <IParameter> parameters; if (_parameters == null) { parameters = new List <IParameter>(); } else { parameters = _parameters.AllParameters; } var memberName = GetAttributeValue(ConfigurationFileAttributeNames.MemberName); ClassMemberData = _classMemberValueInitializerHelper.GetClassMemberData(this, $"{classInfo.TypeCSharpFullName}.{memberName}", parameters); return(ClassMemberData.MemberTypeInfo); }
public object GetValueWithReflection(IConfigurationFileElement configurationFileElement, ClassMemberData classMemberData) { object injectedObject = null; if (classMemberData.IsInjectedClassMember) { #pragma warning disable CS0612, CS0618 if (DiContainerBuilderConfiguration.DiContainerStatic == null) { throw new ConfigurationParseException(configurationFileElement, $"Di container {DiContainerBuilderConfiguration.DiContainerStatic} is not yet initialized"); } injectedObject = DiContainerBuilderConfiguration.DiContainerStatic.Resolve(classMemberData.ClassInfo.Type); if (injectedObject == null) { throw new ConfigurationParseException(configurationFileElement, $"Failed to resolve type '{classMemberData.ClassInfo.TypeCSharpFullName}' from DI container."); } #pragma warning restore CS0612, CS0618 } var classMemberInfo = classMemberData.ClassMemberInfo; if (classMemberInfo is PropertyInfo propertyInfo) { classMemberInfo = propertyInfo.GetGetMethod(); } if (classMemberInfo is MethodInfo methodInfo) { //return methodInfo.Invoke(injectedObject, new object[0]); return(methodInfo.Invoke(injectedObject, classMemberData.Parameters.Select(x => x.GenerateValue()).ToArray())); } if (classMemberInfo is FieldInfo fieldInfo) { return(fieldInfo.GetValue(injectedObject)); } throw new ConfigurationParseException(configurationFileElement, $"Failed to get value from '{classMemberData.ClassInfo.TypeCSharpFullName}.{classMemberData.ClassMemberInfo.Name}'."); }