是否有可能创建一个属性来破坏条件下的构建?

问题描述:

看起来这是可能的,但我找不到有关如何完成它的参考,尽管我已经看到了一些与之密切相关的事情。我有一种特殊类型的课程,需要公共或私人的默认课程。原因是风格;它是一个域聚合,并且在事件存储重放期间应该使用默认ctor的唯一情况。有很明显的方法可以解决这个问题,但我试图锁定这个特定的类型。无论如何,我希望做的是创建一个属性,这个属性可以在类级应用,以强制执行默认ctor的存在。如果没有找到它,它就不会编译......或者至少给它一个像[Obsolete()]这样大的讨厌的蓝色下划线。我认为这对Roslyn来说可能是可行的。任何方向都会有帮助。该解决方案最好与项目一起旅行,而不是需要安装在视觉工作室上的东西。是否有可能创建一个属性来破坏条件下的构建?

+1

是的,听起来像Roslyn分析仪的完美用例。答案太宽了,所以我建议你开始研究它:在解决方案中创建一个属性,用来标记这些东西(尽管如果有其他方法可以找到它们,也可以忽略它)和在语义/语法级别注册分析器,查看它通过的类型的属性,并在您的条件不满足时返回错误级别诊断。 –

+0

@JeroenVannevel你碰巧知道,分析仪是否作为组件的一部分出现?换句话说,我可以创建它并在多个解决方案中使用它吗?否则,感谢至少证实我在正确的轨道上。 – Sinaesthetic

+0

是的,分析仪与解决方案一起打包,因为它们是作为nuget参考添加的 –

只是一个简单的想法,对于公共默认构造函数,你可以利用where T : new()约束的 - 尽管属性不能通用,你可以提供typeof(HasDefaultConstructor<MyClass>)作为参数的属性:

public static class HasDefaultConstructor<T> where T : new() { } 

public class CheckAttribute : Attribute 
{ 
    public CheckAttribute(Type type) { } 
} 

[Check(typeof(HasDefaultConstructor<MyClass>))] 
public class MyClass 
{ 
    public MyClass() { } 
} 

但感觉有点冒险,不得不提供你正在应用属性的类型,并且不适用于非公共构造函数,但它在编译时确实失败,无需任何插件。

+0

谢谢;我有一个类似的想法,但我真的不希望这些域名集合有一个公共ctor。我希望能够解决这个问题,同时也了解更多关于roslyn功能的知识 – Sinaesthetic