コード例 #1
0
        /// <summary>
        /// The constructor to specify a custom conversion
        /// </summary>
        /// <param name="operation">Must always be `ConversionOperation.Base`</param>
        /// <param name="name">The full name (namespace + name) of the type that implements <see cref="ICustomConversionOperation">ICustomConversionOperation</see> interface</param>
        public ConversionAttribute(ConversionOperation operation, string name) : this(operation, 0, ConversionOperation.None, 0)
        {
            if (operation != ConversionOperation.Custom)
            {
                throw new ArgumentException("Operation must be Custom", nameof(operation));
            }

            if (!gTypes.TryGetValue(name, out Type type))
            {
                Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
                type = null;
                foreach (var assembly in assemblies)
                {
                    foreach (var type1 in assembly.GetTypes())
                    {
                        if (type1.FullName == name)
                        {
                            type = type1;
                            break;
                        }
                    }
                    if (type != null)
                    {
                        break;
                    }
                }
                if (type == null)
                {
                    throw new ArgumentException($"Type {name} is not found", nameof(name));
                }
                gTypes.TryAdd(name, type);
            }
            ConversionInterface = Activator.CreateInstance(type) as ICustomConversionOperation;
            if (ConversionInterface == null)
            {
                throw new ArgumentException($"Type {name} does not supprt {nameof(ICustomConversionOperation)}", nameof(name));
            }
        }
コード例 #2
0
        private static Expression OperationToReverseExpression(Expression value, ConversionOperation operation, double factor, ICustomConversionOperation op = null)
        {
            switch (operation)
            {
            case ConversionOperation.Base:
                return(value);

            case ConversionOperation.Add:
                return(Expression.Subtract(value, Expression.Constant(factor)));

            case ConversionOperation.Subtract:
                return(Expression.Add(value, Expression.Constant(factor)));

            case ConversionOperation.SubtractFromFactor:
                return(Expression.Negate(Expression.Subtract(value, Expression.Constant(factor))));

            case ConversionOperation.Multiply:
                return(Expression.Divide(value, Expression.Constant(factor)));

            case ConversionOperation.Divide:
                return(Expression.Multiply(value, Expression.Constant(factor)));

            case ConversionOperation.DivideFactor:
                return(Expression.Divide(Expression.Constant(factor), value));

            case ConversionOperation.Negate:
                return(Expression.Negate(value));

            case ConversionOperation.Atan:
                return(Expression.Call(null, gTan, new Expression[] { value }));

            case ConversionOperation.Custom:
                return(Expression.Call(Expression.Constant(op), op.GetType().GetMethod(nameof(ICustomConversionOperation.FromBase)), new Expression[] { value }));
            }
            return(Expression.Constant(0.0));
        }