я кодирование пользовательского конструктора запросов из выражений, и в каком-то момент я экономлю значение выражения моих критериев класса:Преобразование значения из выражения другого типа C#
switch(expression.NodeType)
{
case ExpressionType.Constant:
{
//Here there should only be raw values
CriteriaClass newCriteria = new CriteriaClass();
newCriteria.Value = expression; //Value is of 'object' type
return newCriteria;
}
}
И когда я на самом деле настраиваю запрос, у меня есть список всех критериев и их значений, которые кажутся прекрасными, но ... их типы все испорчены. Проблема заключается в том, что мой следующий шаг преобразования правильно типы значений для конкретного формата DB:
private string FormatWriteValue(object value, Type type)
{
if (value == null) { return "NULL"; }
if (value.GetType().IsEnum) { return ((int)value).ToString(); }
switch(type.Name)
{
case "Boolean":
case "bool":
return ((bool)value) ? "1" : "0";
case "Int32":
case "int":
return value.ToString();
case "DateTime":
return "CONVERT(DATETIME, '" + ((DateTime)value).ToString("dd/MM/yyyy hh:mm:ss") + "', 103)";
default:
return "'" + value.ToString().Replace("'", "''") + "'";
}
}
Поскольку тип никогда не один из основных, я напечатанных там, он всегда падает на значения по умолчанию случай для строк. Я попытался заливка значения выражения, как это:
criteria.Value = (int)expression; //exception
criteria.Value = Convert.ChangeType(expression, expression.Type); //Type = Int32, but exception again
criteria.Value = Expression.Convert(expression, expression.Type); //Becomes Unary, no exception
Я думаю, что для последнего, чтобы работать, я должен был бы составить выражение, но я читал, что это дорого, и я бы как бы держать это как можно легче.
Как это сделать?
Не думаю, что я полностью понимаю, что вы просите, но попробовали ли Type.GetType()? –
@AnthonyRussell Да, тип, который я получаю, является правильным (например, 'Int32'), но значение не может быть преобразовано из него, так как это' Linq.Expression'. Поэтому я сохраняю переменную «{1}», но это не INT, это тип 'Linq.Expression', и я не могу преобразовать его. – Danicco