/// <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)); } }
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)); }