Я пытаюсь создать служебный метод, который будет загружать коллекции объектов с помощью Reflection.Идея состоит в том, что программист, использующий утилиту, может указать любой тип сущности, и этот метод обнаружит правильный EntityQuery и загрузит контекст с тем, что они запросили.Итак, я получил от пользователя тип Entity и предложение Where, теперь я пытаюсь выяснить, как вызвать метод.Вот что у меня есть:
public void Handle(LoadEntityQuery loadQuery, Action<LoadEntityQueryResult> reply)
{
foreach (var entry in loadQuery.Entities)
{
Type entityType = entry.Key;
Type _contextType = EmployeeJobsContext.Instance.GetType();
MethodInfo _methodInfo = (from x in _contextType.GetMethods()
where x.ReturnType.BaseType == typeof(EntityQuery)
from y in x.ReturnType.GetGenericArguments()
where y == entityType
select x).FirstOrDefault();
if (_methodInfo != null)
{
var query = _methodInfo.Invoke(EmployeeJobsContext.Instance, null);
var _loadMethods = from x in _contextType.GetMethods()
where x.Name == "Load" &&
x.GetParameters().Length == 3
select x;
MethodInfo _loadMethod = null;
if (_loadMethods != null)
{
foreach (MethodInfo item in _loadMethods)
{
ParameterInfo[] _paramInfo = item.GetParameters();
if (_paramInfo[0].ParameterType.BaseType == typeof(EntityQuery) &&
_paramInfo[1].ParameterType.IsGenericType &&
_paramInfo[1].ParameterType.GetGenericArguments().Length == 1 &&
_paramInfo[1].ParameterType.GetGenericArguments()[0].BaseType == typeof(LoadOperation) &&
_paramInfo[2].ParameterType == typeof(object))
{
_loadMethod = item;
break;
}
}
}
MethodInfo _loadOpMethod = this.GetType().GetMethod("LoadOperationResult");
Delegate d = Delegate.CreateDelegate(typeof(LoadOpDel), _loadOpMethod);
if (_loadMethod != null)
{
object [] _params = new object[3];
_params[0] = query;
_params[1] = d;
_params[2] = null;
_loadMethod = _loadMethod.MakeGenericMethod(entityType);
_loadMethod.Invoke(_context, _params);
}
}
}
}
public delegate void LoadOpDel(LoadOperation loadOp);
public void LoadOperationResult (LoadOperation loadOp)
{
if (loadOp.HasError == true)
{
//reply(new LoadEntityQueryResult { Error = loadOp.Error.Message });
loadOp.MarkErrorAsHandled();
}
}
Цикл foreach выполняет итерацию словаря >>, где Key - это тип Entity, а значением - предложение Where.Первая часть кода находит правильный метод EntityQuery и вызывает его для получения фактического запроса.Затем он обнаруживает правильную перегрузку Load (я знаю, вероятно, есть лучший способ найти метод :)). Эта часть кода работает правильно, я могу обнаружить правильный EntityQuery и метод Load.
Для LoadOperation я хочу использовать LoadOperationResult в качестве метода моего делегата.Однако когда я пытаюсь запустить этот код, я получаю исключение о том, что тип делегата и сигнатуры типа метода не совпадают.Я почти уверен, что моя подпись верна, потому что, если бы я должен был вызывать Load напрямую и передавать имя функции как обратный вызов, этот код выполнялся бы правильно.Я довольно хорошо знаком с рефлексивным программированием, однако добавление в микс обратных вызовов Generics и Action немного выше моего уровня на данный момент.Я в растерянности относительно того, что я делаю неправильно, у кого-нибудь есть какие-нибудь указатели для меня?Я далеко?Спасибо за вашу помощь!!Jason