При попытке преобразовать метод в дерево выражений возникла ошибка: «System.Void» нельзя использовать для возвращаемого C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 При попытке преобразовать метод в дерево выражений возникла ошибка: «System.Void» нельзя использовать для возвращаемого

Сообщение Anonymous »

Я пытаюсь преобразовать метод в дерево выражений для теста, но получил ошибку

Код: Выделить всё

Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll Expression of type 'System.Void' cannot be used for return type 'TestDatabase.Models.TestEnum'
и в то же время я хочу знать, как получить входное значение для вывода в качестве теста исключения.
Оригинал метод, который я пытаюсь воссоздать в виде дерева выражений:

Код: Выделить всё

private TEnum ConvertStringToEnum(TDbValueType dbValue)
{
if (Enum.IsDefined(typeof(TEnum), dbValue))
{
return (TEnum)Enum.Parse(typeof(TEnum), (string)(object)dbValue);
}

throw new Exception("");
}
и метод построения дерева выражений:

Код: Выделить всё

public static Func BuildStringToEnumConvertor()
{
var enumType = typeof(TEnum);
var enumTypeExp = Expression.Constant(enumType);

//var labeleExp = Expression.Label(enumType);

var dbValueExp = Expression.Parameter(typeof(TString), "dbValue");
var m = typeof(Enum).GetMethod("IsDefined", [typeof(Type), typeof(object)]);

//test
var testExp = Expression.Call(null, m, enumTypeExp, dbValueExp);

//true
var objExp = Expression.Convert(dbValueExp, typeof(object));
var strExp = Expression.Convert(objExp, typeof(string));

m = typeof(Enum).GetMethod("Parse", [typeof(Type), typeof(string)]);
var retExp = Expression.Call(null, m, enumTypeExp, strExp);
objExp = Expression.Convert(retExp, enumType);

//var returnExp = Expression.Return(labeleExp, objExp);

//false
//var x = Expression.Lambda(dbValueExp).CompileFast();
//var x = Expression.Lambda(dbValueExp).Compile();

var falseExp = Expression.Throw(Expression.Constant(new Exception($"could not convert \" {{how to get the input parameter value ??}} \" to type \"{typeof(TEnum).Name}\".")));

var xxExp = Expression.IfThenElse(testExp, objExp, falseExp);

//var block = Expression.Block(objExp, falseExp);

//return Expression.Lambda(block, dbValueExp).CompileFast();
return Expression.Lambda(xxExp, dbValueExp).Compile(); 

Подробнее здесь: [url]https://stackoverflow.com/questions/79202145/when-trying-to-convert-a-method-to-expression-tree-got-an-error-system-void-c[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»