Вы можете кэшировать отраженный MethodInfo
в Dictionary<string, MethodInfo>
, чтобы вам не приходилось искать его каждый раз, когда вы вызываете MyClass.GetResult(string methodName)
.
public class MyClass
{
private string GetResult(string methodName)
{
if (!_methods.TryGetValue(methodName, out MethodInfo method))
{
method = typeof(IService).GetMethods().FirstOrDefault(x => x.Name == methodName);
_methods.Add(methodName, method);
}
method.Invoke(Service, null);
return Service.GetResult();
}
private static readonly Dictionary<string, MethodInfo> _methods = new Dictionary<string, MethodInfo>();
}
Кроме того, вы можете удалить отражение в каждом из методов publi c в MyClass
, используя nameof
выражение .
public class MyClass
{
public string MethodA()
{
return GetResult(nameof(MethodA));
}
}
Или, конечно, если ваша сторонняя зависимость изменяет имя метода тогда у вас все еще есть проблема, когда это проявляется как ошибка времени выполнения, а не ошибка времени компиляции. Итак, вы можете исправить это, используя nameof
с именем метода на IService
.
public class MyClass
{
public string MethodA()
{
return GetResult(nameof(IService.MethodA));
}
}
Теперь, если имя метода на IService
изменится, вы получите ошибку компилятора.
Это должно быть лучше оптимизировано с точки зрения производительности, чем ваш пример. Кроме ... чего ты добился на данный момент? Каждый метод publi c на MyClass
по-прежнему должен напрямую ссылаться на соответствующий метод на IService
. IE, MyClass.MethodA
напрямую ссылается на IService.MethodA
. Итак, почему бы просто не вызвать Service.MethodA
и сэкономить сложность и затраты на производительность, связанные с отражением?
Кроме того, вы обеспокоены тем, что ваша сторонняя зависимость изменяет имя метода и создает ошибки времени выполнения вместо времени компиляции ошибки и описанный здесь подход должны решить эту проблему. Но что, если ваша сторонняя зависимость изменяет подпись метода? Например, IService.MethodA()
становится IService.MethodA(string param1)
? Теперь вы вернулись к исходной точке с исключениями времени выполнения вместо ошибок компилятора.
Я понимаю, что то, что вы опубликовали, является просто примером, и что я не могу понять полный контекст того, что вы пытаетесь сделать, основываясь только на примере. Но, основываясь на этом примере, на мой взгляд, лучшая версия MyClass
- это версия без отражения . Я действительно изо всех сил пытаюсь понять, что вы получите, используя отражение для вызова IService
, а не просто вызывая методы напрямую.