是否可以创建一个在某种条件下破坏构建的属性?

时间:2017-07-06 21:21:11

标签: c# roslyn roslyn-code-analysis

这似乎是可能的,但我找不到如何实现它的参考,尽管我已经看到了一些密切相关的事情。我有一种特殊类型的类需要公共或私人默认ctor。原因是风格;它是一个域聚合,唯一应该使用默认ctor的情况是在事件存储重放期间。有明显的方法可以解决这个问题,但我试图锁定这种特定的类型。无论如何,我希望做的是创建一个可以在类级别应用的属性,该属性将强制存在默认的ctor。如果找不到它,它就不会编译......或者至少给它一个像[Obsolete()]那样令人讨厌的蓝色下划线。我认为这对Roslyn来说可能是可行的。任何方向都会有所帮助理想情况下,解决方案可以随项目一起旅行,而不是需要安装在visual studio上。

1 个答案:

答案 0 :(得分:1)

一个简单的想法,对于公共默认构造函数,您可以使用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() { }
}

但感觉有点hacky必须提供你应用属性的类型,并且不适用于非公共构造函数,但它在编译时失败而不需要任何插件