Вы можете использовать некоторые предустановленные переменные Dictionary
, чтобы сопоставить строки с Type
и операторами, а затем вручную построить Expression
и скомпилировать их:
static Dictionary<string, Type> TypeMap = new Dictionary<string, Type> {
{ "int", typeof(Int32) },
{ "double", typeof(double) }
};
static Dictionary<string, (ExpressionType opType, Type methodType, string methodName)> OpMap = new Dictionary<string, (ExpressionType, Type, string)> {
{ "sum", (ExpressionType.Add, null, "") },
{ "difference", (ExpressionType.Subtract, null, "") },
{ "multiply", (ExpressionType.Multiply, null, "") },
{ "max", (ExpressionType.Call, typeof(Math), "Max") },
{ "min", (ExpressionType.Call, typeof(Math), "Min") },
};
Func<object, object, object> MakeFunction(string op, string dataType) {
var parmType = TypeMap[dataType];
var parma = Expression.Parameter(typeof(object), "a");
var parmb = Expression.Parameter(typeof(object), "b");
var changeTypeMI = typeof(Convert).GetMethod("ChangeType", new[] { typeof(object), typeof(Type) });
var exprParmType = Expression.Constant(parmType);
var lefta = Expression.Convert(Expression.Call(changeTypeMI, parma, exprParmType), parmType);
var rightb = Expression.Convert(Expression.Call(changeTypeMI, parmb, exprParmType), parmType);
Expression expr = null;
var opTuple = OpMap[op];
switch (opTuple.opType) {
case ExpressionType.Call:
var mi = opTuple.methodType.GetMethod(opTuple.methodName, new[] { parmType, parmType });
expr = Expression.Call(mi, lefta, rightb);
break;
default:
expr = Expression.MakeBinary(opTuple.opType, lefta, rightb);
break;
}
var body = Expression.Convert(expr, typeof(object));
return Expression.Lambda<Func<object, object, object>>(body, parma, parmb).Compile();
}
Примечание: я добавил позвоните на Convert.ChangeType
для обработки, если вы передали, например, int для функции, которую вы сделали для "double". Вы можете удалить его и просто оставить в акте Expression.Convert
, если вы собираетесь передавать только соответствующие типы.
Это берет любой из одного параметра, как дали ниже.
Const xlFormatFromLeftOrAbove = 0
Member of Excel.XlInsertFormatOrigin
и...
Const xlFormatFromRightOrBelow = 1
Member of Excel.XlInsertFormatOrigin
При добавлении к комментариям Lakshmanaraj - это берет параметр форматирования в зависимости от того, где Вы вставляете ячейки и что форматирование Вас хочет выбрать.
Позволяет говорят, что Вы имеете:
первая строка, которая имеет полужирный текст,
вторая строка имеет вещи в курсиве.
Вы выбираете 2-ю строку и выполняете следующее выражение:
Selection.Insert CopyOrigin:=xlFormatFromLeftOrAbove
Новая строка вставляется между 1-й и 2-й строкой, и она выбирает правила форматирования от "строки выше" или "ячейки слева от ячейки".
В этом случае недавно вставленные ячейки будут иметь текст как полужирный без Вас устанавливающий его явно.