Невозможно вызвать JsonConvert.Deserialize Object с помощью дерева выражений - PullRequest
0 голосов
/ 21 июня 2020

Итак, я хочу создать функцию с использованием Expression, которая будет принимать строку и преобразовывать ее в другой объект. Типы объектов передаются методу генерации функции, так что он может создать contrustor 1, используя другой в качестве типа параметра:

public class HubObject
{
     internal HubObject(ElnObject elnObj)
     {//stuff}
}

Итак, я в основном хочу, чтобы мое выражение выглядело так после компиляции:

Func<string,object> convertor = (strContent) => {
      var elnObj = JsonConvert.Deserialize<ElnObject>(strContent);
      var hubObj = new HubObject(elnObj);
      return hubObj;
}

Вот что я сделал: функция создана, но когда я пытаюсь запустить свою сгенерированную функцию, она дает исключение с нулевым значением в самом начале. Я даже не могу начать отладку.

    public Func<string, object> GetHubObjectGenerator(Type elnObjectType, Type hubObjectType)
    {
        var inputString = Expression.Parameter(typeof(string), "strContent");

        var varElnObj = Expression.Variable(elnObjectType, "elnObj");

        //var hi = nameof(JsonConvert.DeserializeObject);
        //var method = typeof(JsonConvert).GetMethod(hi, BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(string) }, null);
        var method = typeof(JsonConvert).GetMethods(BindingFlags.Public | BindingFlags.Static)
                            .Where(i => i.Name.Equals("DeserializeObject", StringComparison.InvariantCulture))
                            .Where(i => i.IsGenericMethod)
                            .Where(i => i.GetParameters().Select(a => a.ParameterType).SequenceEqual(new[] { typeof(string) }))
                            .Single();

        var methodJsonConvert = method.MakeGenericMethod(new[] { elnObjectType });
        var methodCall = Expression.Call(methodJsonConvert, inputString);
        var assignJsonObj = Expression.Assign(varElnObj, methodCall);

        var varHubObj = Expression.Variable(hubObjectType, "hubObj");
        var constructor = hubObjectType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { elnObjectType }, null);
        var instantiation = Expression.New(constructor, varElnObj);
        var assignHubObj = Expression.Assign(varHubObj, instantiation);

        var body = Expression.Block(new[] { varElnObj, varHubObj },
                                    assignJsonObj,
                                    assignHubObj,
                                    varHubObj);

        var lambda = Expression.Lambda<Func<string, object>>(body, inputString);

        return lambda.Compile();
    }

Итак, когда я это сделаю:

var gen = GetHubObjectGenerator(typeof(ElnObject), typeof(HubObject));
gen(strContent); ---I get an error here. I cant even sart debugging.
...