У меня есть универсальный класс, в котором есть метод 'Call' с универсальным типом возврата и лямбда-выражением в качестве параметра. Это должно быть сгенерировано с помощью отражения, и, поскольку типы неизвестны, мне нужно создать лямбда-выражение на долгий путь. У меня есть рабочее решение, перечисленное ниже, но мне не нравится выводить экземпляр из универсального класса, поскольку он является закрытым и выполняет некоторую логику при получении.
Класс:
public class Proxy<T>
{
public TR Call<TR>(Func<T, TR> serviceInvoke)
private T Instance
}
Использование отражения:
var serviceInstance = proxy.GetType().GetProperty("Instance", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(proxy, null);
var serviceMethod = type.GetMethod(rule.ServiceMethodName);
var parameters = serviceMethod.GetParameters().Select(parameterInfo => PropertyChainNavigator.GetValueForPropertyChain(((string)rule.Parameters[parameterInfo.Name]).Split(new[] { '.' }), context)).ToArray();
var thisParam = Expression.Constant(serviceInstance);
var valueParams = parameters.Select(Expression.Constant).ToList();
var call = Expression.Call(thisParam, serviceMethod, valueParams);
var func = Expression.Lambda(call, Expression.Parameter(type)).Compile();
var callMethod = proxy.GetType().GetMethods().Where(x => x.Name == "Call" && x.ReturnType != typeof(void)).First().MakeGenericMethod(serviceMethod.ReturnType);
result = callMethod.Invoke(proxy, new[] { func });
Нормальное использование:
var proxy = new Proxy<ITestClass>();
proxy.Call(x => x.Method);
Я попытался изменить Expression.Call, чтобы он не создавал экземпляр, но это работает только для статических методов. Кто-нибудь знает способ для меня, чтобы создать вызов, превратить его в лямбду и сделать его без ошибок