C# 将类型用作操作参数时出现自定义编译错误

C# 将类型用作操作参数时出现自定义编译错误,c#,asp.net-core,stylecop,C#,Asp.net Core,Stylecop,我正在为一组web应用程序实现一个标识符类型库,出于法规遵从性原因,我想将某些类型标记为不适合发送给客户机/从客户机接收 使用变量本身不会导致运行时错误或问题,只是由于安全原因,发送到客户端是不安全的 最好是当禁用类型被用作动作参数时,我希望引起编译错误,以便为开发人员提供即时反馈和良好的体验 我目前使用的示例如下: public interface IInternalIdentifier {} public class NonCompliantType : IInternalIdentifi

我正在为一组web应用程序实现一个标识符类型库,出于法规遵从性原因,我想将某些类型标记为不适合发送给客户机/从客户机接收

使用变量本身不会导致运行时错误或问题,只是由于安全原因,发送到客户端是不安全的

最好是当禁用类型被用作动作参数时,我希望引起编译错误,以便为开发人员提供即时反馈和良好的体验

我目前使用的示例如下:

public interface IInternalIdentifier {}

public class NonCompliantType : IInternalIdentifier {}

[ApiController]
public class BananaController : ControllerBase
{
    public async Task<ActionResult> Cavendish(int good, NonCompliantType bad)
    {
        return Ok();
    }
}
C#有没有什么内置的方式来做这样的事情

我们也在使用StyleCop,有没有办法创建一个可以做到这一点的规则

这可以使用单元测试或在运行时使用反射来完成,但是我的目标是立即向开发人员反馈他们如何使用这些类型,并尽可能保持应用程序的干净

单元测试可能会延迟10-15分钟,运行时会减慢启动时间,或者可能会在生产中引起问题

我们的旧代码库目前正在使用基于反射的单元测试,但由于此库将用于任何数量的web应用程序和微服务,因此确保每个应用程序和微服务都有一个等效的测试将非常麻烦且容易出错。

一些想法:

  • 您可以将项目拆分为几个程序集,其中web应用程序代码的程序集无法访问包含禁用类型的程序集。但是中间会有一个或多个程序集可以访问两边(如果你想要的话)。
  • 一个风格的通用作战图规则应该是可能的
  • 我个人的选择是添加一些启动代码,使用反射来检查所有控制器操作方法,如果发现任何不喜欢的类型,就会使应用程序崩溃

  • 使用
    custommodelbinder
    reflection
    检查类型参数,如果它是
    BadType
    ,则引发异常。将其设置为内部类型,可能在单独的项目中。不确定是否需要自定义模型活页夹,但这也行。StyleCop已被替代。事实上,大多数StyleCop规则已经迁移到Roslyn分析器。您可以创建自己的分析器,在遇到特定情况时会发出警告或错误,甚至提供修复。几个库,例如NuGet和xUnit包含用于常见代码问题的分析器。本节介绍如何创建自己的分析器。可以在[Tutorial:Write your first analyzer and code fix]9中找到分步guidhttps://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/tutorials/how-to-write-csharp-analyzer-code-fix)您好,Mike,不幸的是,控制器/服务可能仍然需要在内部引用这些类型,以便它们对web程序集保持可见。对于大型应用程序来说,在启动时添加使应用程序崩溃的代码是非常危险的,当应用程序故意崩溃时,开发人员会感到非常沮丧,这些类型也可能在许多不同的应用程序中使用,这会使复制粘贴崩溃代码成为一种痛苦。@Serdalis您的评论毫无意义,抱歉-您似乎更喜欢等待应用程序到达无法工作的方法,并随机崩溃,这很奇怪。除了反射之外,真的没有什么可以做的了,看看什么动作类型参数可以做你想要的。。。如果您碰巧有开发人员运行单元测试,您可以执行与测试相同的操作。。。但除此之外,当反射代码检测到作为操作参数的无效类型时,除了启动时崩溃之外,我看不到任何其他途径…@AlexeiLevenkov我在问题中添加了更多信息。希望这足以为问题/评论提供更多的背景。
    Error: Type [NonCompliantType : IInternalIdentifier] Cannot be used as an action parameter.