Пример:
По причинам, выходящим за рамки этого примера, я вынужден использовать это:
UserRepository repository = new UserRepository();
User user = (User)InvokeMethod(repository, "GetUserById", new object[]{2});
private object InvokeMethod(object source, string methodName, object[] parameters)
{
Type sourceType = source.GetType();
MethodInfo methodInfo = sourceType.GetMethod(methodName);
return methodInfo.Invoke(source, parameters);
}
Однако я бы предпочел что-то подобное:
UserRepository repository = new UserRepository();
User user = GetUserById<User, UserRepository>(repository, m => m.GetUserById(2));
Обертка может сделать это.Я начал строить один, но застрял.Вот что у меня есть:
public TUser GetUserById<TUser, TUserRepository>(TUserRepository repository, Expression<Func<TUserRepository, TUser>> repositoryFunc)
where TUser : User
where TUserRepoistory : UserRepository
{
// How do I use the Expression to setup the next two statements?
string methodName = ""; // should be "GetUserId"
object[] params = null; // should be "object[] { 2 }"
TUser user = (TUser)InvokeMethod(repository, methodName, parameters);
}
Имейте в виду, что я вынужден использовать метод InvokeMethod.Я не могу просто вызвать Func.