1

我想使用 FluentAssertions 来测试所有没有用 NonActionAttribute 修饰的方法。(这将减少由 T4MVC 作为占位符自动生成的操作方法集。)

我的具体问题是将 MethodInfoSelector 方法链接在一起。我想写这样的东西:

   public MethodInfoSelector AllActionMethods() {
        return TestControllerType.Methods()
            .ThatReturn<ActionResult>()
            .ThatAreNotDecoratedWith<NonActionAttribute>();
   }

    public static MethodInfoSelector ThatAreNotDecoratedWith<TAttribute>(this IEnumerable<MethodInfo> selectedMethods) {
        return (MethodInfoSelector)(selectedMethods.Where(method => !method.GetCustomAttributes(false).OfType<TAttribute>().Any())); // this cast fails
    }

转换失败,或者如果我将结果转换为 IEnumberable,我无法链接其他 MethodInfoSelector 方法。

对于如何生成 MethodInfoSelector 或针对列出没有特定属性的方法的潜在问题的不同方法,我将不胜感激。

4

1 回答 1

1

Fluent Assertions 目前没有公开的成员允许您这样做。您最好的解决方案是转到GitHub 上的 Fluent Assertions 项目,然后打开一个问题或提交一个拉取请求,以便在 FA 代码库中修复此问题。

我意识到这可能被视为一个非答案,所以为了完整起见,我将抛弃你可以使用反射来解决这个问题,尽管通常关于反射私人成员的免责声明适用。这是一种可以让链接工作的实现:

public static MethodInfoSelector ThatAreNotDecoratedWith<TAttribute>( this MethodInfoSelector selectedMethods)
{
    IEnumerable<MethodInfo> methodsNotDecorated = selectedMethods.Where(
        method =>
            !method.GetCustomAttributes(false)
                .OfType<TAttribute>()
                .Any());

    FieldInfo selectedMethodsField =
        typeof (MethodInfoSelector).GetField("selectedMethods",
            BindingFlags.Instance | BindingFlags.NonPublic);

    selectedMethodsField.SetValue(selectedMethods, methodsNotDecorated);

    return selectedMethods;
}
于 2014-06-06T04:42:02.663 回答