假设我按以下方式获得MethodInfo:
Assembly assembly = Assembly.Load(assemblyName);
Type type = assembly.GetType(nameSpaceName+"."+className);
MethodInfo mi = type.GetMethod("myMethod", bf); // bf are the binding flags.
但后来我决定改变myMethod
的案例/名称。
有没有办法:
这样做的原因是我可以测试我需要使用反射的代码,但我不想要求没有人更改代码中方法的名称。
答案 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");