コード例 #1
0
 public ClassMemberValueInitializer([NotNull] IConfigurationFileElement configurationFileElement,
                                    [NotNull] IClassMemberValueInitializerHelper classMemberValueInitializerHelper,
                                    [NotNull] ClassMemberData classMemberData)
 {
     _configurationFileElement          = configurationFileElement;
     _classMemberValueInitializerHelper = classMemberValueInitializerHelper;
     ClassMemberData = classMemberData;
 }
コード例 #2
0
        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());
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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}'.");
        }