Ejemplo n.º 1
0
        /// <summary>
        /// Initializes the specified options.
        /// </summary>
        /// <param name="options">The options.</param>
        private void Initialize(DynamicStaticMethodOptions options)
        {
            try
            {
                options.CheckNullObject(nameof(options));
                options.DynamicCode.CheckEmptyString(nameof(options.DynamicCode));
                Type type = null;

                if (!string.IsNullOrWhiteSpace(options.ClassName) && !string.IsNullOrWhiteSpace(options.MethodName))
                {
                    if (options.ClassName == options.MethodName)
                    {
                        throw new InvalidObjectException(nameof(options), data: new { options }, reason: "Conflict name for compile closure.");
                    }

                    type = ReflectionExtension.SmartGetType(string.Format("{0}.{1}", _namespace, options.ClassName));
                    if (type != null)
                    {
                        _methodInfo = type.GetMethod(options.MethodName);

                        if (_methodInfo != null && _methodInfo.IsStatic)
                        {
                            return;
                        }
                    }
                }

                var tmpId         = Guid.NewGuid().ToString("N");
                var generatedCode = BuildMethodCodeAsClass(options, tmpId);

                TempAssemblyProvider provider = new TempAssemblyProvider();
                var tempAssembly = provider.CreateTempAssembly(generatedCode.AsArray());

                type = ReflectionExtension.SmartGetType(string.Format("{0}.DynamicStatiClass{1}", _namespace, tmpId));
                type.CheckNullObjectAsInvalid(nameof(options), data: new { options, generatedCode, tmpId });

                _methodInfo = type.GetMethod(string.Format("DynamicStaticMethod{0}", tmpId));
            }
            catch (Exception ex)
            {
                throw ex.Handle(new { options });
            }
        }
        /// <summary>
        /// Creates the deep equality instance.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        internal static IDeepEquality <T> CreateDeepEqualityInstance <T>(StringComparison stringComparison)
        {
            Type   type = typeof(T);
            object instance;

            if (!equalityInstances.TryGetValue(type, out instance))
            {
                lock (locker)
                {
                    if (!equalityInstances.TryGetValue(type, out instance))
                    {
                        var typeName = type.GenerateUniqueTypeName();
                        var codes    = CreateDeepEqualityClassCode(type, typeName, stringComparison);

                        TempAssemblyProvider provider = new TempAssemblyProvider();
                        var tmpAssembly = provider.CreateTempAssembly(codes, TempAssemblyProvider.GetCurrentAppDomainAssemblyLocations(), type.Namespace.AsArray(), @namespace: _namespace);
                        instance = tmpAssembly.CreateInstance(string.Format("{0}.{1}", _namespace, typeName));
                        equalityInstances.Add(type, instance);
                    }
                }
            }

            return(instance as IDeepEquality <T>);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Gets the default assembly to load.
 /// </summary>
 /// <returns>HashSet&lt;Assembly&gt;.</returns>
 protected override HashSet <Assembly> GetDefaultAssembliesToLoad()
 {
     return(TempAssemblyProvider.GetDefaultAdditionalAssembly());
 }