Итак, я хочу создать функцию с использованием 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.