我正在查看CallerMemberName属性。当您指定这样的方法时
public void TraceInfo(string propertyName, [CallerMemberName] string memberName)
我们收到一个编译时错误,说明
带有来电者信息的参数必须具有默认值
CallerMemberName属性是密封的,我想强制使用像这个类一样的默认参数
如何对常规属性类的默认值实施相同的策略?
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
public sealed class DefaultEnforcedAttribute : Attribute
{
public DefaultEnforcedAttribute()
{
}
}
答案 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。
另一个将作为项目构建的一部分集成的老派方法可以是一个MSBuild目标,调用在C#中实现的MSBuild任务,该任务可以加载使用AfterTargets
属性构建的程序集{ {1}},其值为<Target>
。它看起来如下:
"AfterBuild"
该任务将加载整个程序集并使用反射,它将查找具有使用某些属性的参数的方法的所有类型。如果某个参数具有强制默认参数值的属性但参数没有默认值,则会抛出一个构建错误,其中包含一条有意义的消息,指出哪个方法在整个验证过程中失败。
也许你对罗斯琳为你带来的更广泛的可能性感到兴奋。查看此问答,有人已回答安装Visual Studio扩展可以将其包装为 NuGet包: