Как выполнить рефакторинг, когда отражение используется для получения методов по имени? - PullRequest
2 голосов
/ 05 апреля 2011

Предположим, я получаю MethodInfo следующим образом:

Assembly assembly = Assembly.Load(assemblyName);
Type type = assembly.GetType(nameSpaceName+"."+className);
MethodInfo mi = type.GetMethod("myMethod", bf); // bf are the binding flags.

Но позже я решу изменить регистр / имя на myMethod.

Есть ли способ либо:

  1. Рефакторинг, чтобы он изменил имя в строке.
  2. Изменить вызов отражения, чтобы он получал метод, не используя имя метода в качестве строки?

Причина этого в том, что я могу протестировать свой код, который требует использования отражения, но я бы предпочел не требовать, чтобы никто никогда не менял имя методов в коде.

Ответы [ 4 ]

2 голосов
/ 05 апреля 2011

Если вы используете Visual Studio для проведения рефакторинга, есть опция для поиска буквенных строк и комментариев по имени и их изменения. Тем не менее, я настоятельно рекомендую использовать предварительный просмотр при использовании этой опции, чтобы убедиться, что вы меняете только те части, которые ожидаете.

Конечно, вы можете использовать константу типа internal const string methodName = "methodName";, чтобы у вас была буквальная строка только один раз. Вы можете вручную изменить один строковый литерал при рефакторинге имени метода. Вы также сможете переименовать methodName более просто.

1 голос
/ 05 апреля 2011

У вас есть конкретная ссылка на рассматриваемый тип?

Даже если у вас его нет явно, вы можете сделать метод универсальным.Вы могли бы сделать это без отражения вообще:

public void TestMethod<TargetType>(object o)
{
    if (o is TargetType) {
        TargetType strongType = o as TargetType;
        strongType.myMethod();
    }
}
1 голос
/ 05 апреля 2011

Вы можете использовать пользовательский атрибут и украшать ваши методы этим атрибутом.Затем вместо получения метода по имени вы можете получить его по идентификатору, определенному в атрибуте.Таким образом, имя метода может меняться так часто, как это необходимо ... просто мысль.

[AttributeUsage(AttributeTargets.Method)]
public class CustomMethodAttribute : Attribute
{
    public string ID { get; set; }
}

Использование:

[CustomMethodAttribute(ID = "UniqueIDHere")]
public void Test()
{

}
0 голосов
/ 11 сентября 2012

Для методов и свойств попробуйте использовать деревья выражений. Вы можете получить от них информацию об отражении, сохранив проверку времени компиляции и включив автоматический рефакторинг. Я верю, что вы можете получить информацию, связанную со сборкой, и имена пространств имен. Просто напишите несколько вспомогательных функций, которые могут извлекать такую ​​информацию из деревьев выражений.

Вы можете найти несколько вспомогательных функций здесь Они позволяют писать такой код:

FirePropertyChanged(() => PropertyName);

, что совпадает с

FirePropertyChanged("PropertyName");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...