2017-07-06 68 views
0

看起來這是可能的,但我找不到有關如何完成它的參考,儘管我已經看到了一些與之密切相關的事情。我有一種特殊類型的課程,需要公共或私人的默認課程。原因是風格;它是一個域聚合,並且在事件存儲重放期間應該使用默認ctor的唯一情況。有很明顯的方法可以解決這個問題,但我試圖鎖定這個特定的類型。無論如何,我希望做的是創建一個屬性,這個屬性可以在類級應用,以強制執行默認ctor的存在。如果沒有找到它,它就不會編譯......或者至少給它一個像[Obsolete()]這樣大的討厭的藍色下劃線。我認爲這對Roslyn來說可能是可行的。任何方向都會有幫助。該解決方案最好與項目一起旅行,而不是需要安裝在視覺工作室上的東西。是否有可能創建一個屬性來破壞條件下的構建?

+1

是的,聽起來像Roslyn分析儀的完美用例。答案太寬了,所以我建議你開始研究它:在解決方案中創建一個屬性,用來標記這些東西(儘管如果有其他方法可以找到它們,也可以忽略它)和在語義/語法級別註冊分析器,查看它通過的類型的屬性,並在您的條件不滿足時返回錯誤級別診斷。 –

+0

@JeroenVannevel你碰巧知道,分析儀是否作爲組件的一部分出現?換句話說,我可以創建它並在多個解決方案中使用它嗎?否則,感謝至少證實我在正確的軌道上。 – Sinaesthetic

+0

是的,分析儀與解決方案一起打包,因爲它們是作爲nuget參考添加的 –

回答

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() { } 
} 

但感覺有點冒險,不得不提供你正在應用屬性的類型,並且不適用於非公共構造函數,但它在編譯時確實失敗,無需任何插件。

+0

謝謝;我有一個類似的想法,但我真的不希望這些域名集合有一個公共ctor。我希望能夠解決這個問題,同時也瞭解更多關於roslyn功能的知識 – Sinaesthetic

相關問題