当使用反射来按名称获取方法时如何重构?

时间:2011-04-05 17:00:49

标签: c# reflection refactoring

假设我按以下方式获得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. 更改反射调用,以便在不使用方法名称作为字符串的情况下获取方法?
  3. 这样做的原因是我可以测试我需要使用反射的代码,但我不想要求没有人更改代码中方法的名称。

4 个答案:

答案 0 :(得分:2)

如果使用Visual Studio进行重构,则可以选择搜索文字字符串和注释以查找名称并更改这些字符串。但强烈建议您在使用该选项时使用预览,以确认您只是更改了预期的部件。

当然,您可以使用类似internal const string methodName = "methodName";的常量,这样您只需要一次文字字符串。重构方法名称时,可以手动更改一个字符串文字。您还可以更轻松地重命名methodName

答案 1 :(得分:1)

您可以使用自定义属性,并使用此属性修饰方法。然后,不是通过名称获取方法,而是可以通过属性中定义的ID获取它。这样,方法名称可以根据需要随时改变...只是一个想法。

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

用法:

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

}

答案 2 :(得分:1)

您是否对相关类型有具体的参考?

即使您没有明确地使用它,也可以使该方法通用。

public void TestMethod<TargetType>(object o)
{
    if (typeof(TargetType).IsAssignableFrom(o.GetType())) {
        TargetType strongType = o as TargetType;
        strongType.myMethod();
    }
}

事实上,你可以在没有反思的情况下做到这一点:

public void TestMethod<TargetType>(object o)
{
    if (o is TargetType) {
        TargetType strongType = o as TargetType;
        strongType.myMethod();
    }
}

答案 3 :(得分:0)

对于方法和属性,请尝试使用表达式树。 您可以从中获取与反射相关的信息,从而节省编译时检查并启用自动重构。 我相信你也可以获得与汇编相关的信息和命名空间名称。 只需编写几个可以从表达式树中检索此类信息的辅助函数。

你可以找到几个辅助函数here 他们允许编写这样的代码:

FirePropertyChanged(() => PropertyName);

相同
FirePropertyChanged("PropertyName");