gpt4 book ai didi

c# - 重构检索方法名称的安全方法

转载 作者:行者123 更新时间:2023-12-02 14:14:08 25 4
gpt4 key购买 nike

我知道一种重构安全的方法来获取属性的名称 this answer 。是否有重构安全的方法来获取方法的名称?

我正在使用 C# 5 和 .Net 4.5。

为了说明我正在尝试做的事情:

class MyClass
{
public void UnitTestOne() { /* impl */ }
public void UnitTestTwo() { /* impl */ }
public void UnitTestThree()
{
//I'd like to get the method names for UnitTestOne and UnitTestTwo here
//in such a way that this code will raise a compile time error if either
//the UnitTestOne or UnitTestTwo method names changes.
}
}

最佳答案

更新:这是一篇很好的文章,解释并提供了一种灵活的实用方法来使用重构安全代码访问 MethodInfos。 http://www.codeducky.org/10-utilities-c-developers-should-know-part-two/

<小时/>

如果您只想涵盖 void 无参数方法,我认为 Jon Skeet 的答案很好。更通用的解决方案如下所示:

public class MyClass
{
public void UnitTestOne(int i) { /* impl */ }
public int UnitTestTwo() { /* impl */ }
public void UnitTestThree()
{
var methodCallExpressions = new Expression<Action<MyClass>>[] {
mc => mc.UnitTestOne(default(int)), //Note that a dummy argument is provided
mc => mc.UnitTestTwo()
};

var names = methodCallExpressions.Select(mce =>
((MethodCallExpression) mce.Body).Method.Name);
}
}

请注意,我们使用 Expression<Action<MyClass>> 数组为了制作 MyClass 上的方法调用列表不知道每个方法调用的返回类型和参数类型。每个方法调用表达式都提供了虚拟变量来实例化该表达式。

然后每个表达式的主体被转换为 MethodCallExpression正如类型名称所示,它包含一个表达式,该表达式只是方法的调用。该类型有 Method属性是 MethodInfo被调用的方法。

在您提供的链接中,使用 MemberExpression 类似地提取属性名称。 。使用MethodCallExpression使得这些例子非常相似。

顺便说一句,您还可以使用 Expression<Action>而不是Expression<Action<MyClass>>如果你更喜欢。替换methodCallExpressions实例化为:

var methodCallExpressions = new Expression<Action>[] { 
() => this.UnitTestOne(default(int)),
() => this.UnitTestTwo()
};

我认为这主要是一种风格决定,尽管它也允许您使用 () => (new MyClass2()).UnitTestThree() 之类的东西封装不同类上的方法调用。 .

关于c# - 重构检索方法名称的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com