创建规则以在Parameter属性上强制执行默认值

时间:2017-02-23 20:29:52

标签: c# parameters attributes default

我正在查看CallerMemberName属性。当您指定这样的方法时

public void TraceInfo(string propertyName, [CallerMemberName] string memberName)  

我们收到一个编译时错误,说明

  

带有来电者信息的参数必须具有默认值

CallerMemberName属性是密封的,我想强制使用像这个类一样的默认参数

如何对常规属性类的默认值实施相同的策略?

[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
public sealed class DefaultEnforcedAttribute : Attribute
{
    public DefaultEnforcedAttribute()
    {
    }
}

1 个答案:

答案 0 :(得分:1)

这些验证是在编译时完成的,因此,它们应该由编译器实现。

好消息是自编译器平台 Roslyn 开始以来,您可以实现访问者,这样您就可以使用自定义验证扩展C#编译器。

我会开始阅读这些其他Q& As以查看使用Roslyn检查事物的示例:

另外,您应该阅读Roslyn的官方文档,特别是本文:Getting Started C# Syntax Analysis。另请参阅C# and Visual Basic - Use Roslyn to Write a Live Code Analyzer for Your API

最后,您可能需要下载并安装.NET Compiler Platform SDK

方法#2适用于那些不喜欢在多台计算机上安装Visual Studio扩展的人

另一个将作为项目构建的一部分集成的老派方法可以是一个MSBuild目标,调用在C#中实现的MSBuild任务,该任务可以加载使用AfterTargets属性构建的程序集{ {1}},其值为<Target>。它看起来如下:

"AfterBuild"

该任务将加载整个程序集并使用反射,它将查找具有使用某些属性的参数的方法的所有类型。如果某个参数具有强制默认参数值的属性但参数没有默认值,则会抛出一个构建错误,其中包含一条有意义的消息,指出哪个方法在整个验证过程中失败。

方法#3:使用NuGet

安装Roslyn扩展

也许你对罗斯琳为你带来的更广泛的可能性感到兴奋。查看此问答,有人已回答安装Visual Studio扩展可以将其包装为 NuGet包