2017-07-06 8 views
0

これは可能だったようですが、それを達成するための参考文献は見つかりませんが、密接に関係するいくつかのことを見てきました。私は公的または私的なデフォルトのctorを必要とする特定のタイプのクラスを持っています。理由は文体です。ドメイン集約であり、デフォルトのctorを使用する唯一のケースは、イベントストアの再生中です。これを回避する明白な方法がありますが、私はこの特定のタイプをロックダウンしようとしています。とにかく、私がやりたいことは、デフォルトのctorの存在を強制するクラスレベルで適用できる属性を作成することです。見つからない場合、コンパイルされません。または、少なくとも、Obsolete()のように大きな不快な青い下線を付けます。私はこれがRoslynと潜在的に行為できると考えました。どんな方向にも役立ちます。ソリューションは理想的には、ビジュアルスタジオにインストールする必要があるものではなく、プロジェクトと共に移動します。条件の下でビルドを破る属性を作成することはできますか?

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

しかし、それは感じている:属性を使用すると、属性の引数としてtypeof(HasDefaultConstructor<MyClass>)を供給することができ、一般的なことができないにもかかわらず -

+1

驚くべきことに、Roslynアナライザの完璧なユースケースのようです。それは答えが広すぎるので、探し始めることをお勧めします。これらの項目をマークするために使用する属性をソリューションに作成します(ただし、タイプを見つける別の方法がある場合は省略することもできます)。それが渡す型の属性を調べるセマンティック/構文レベルのアナライザーを登録し、条件が満たされていないときにエラーレベルの診断を返します。 –

+0

@ JeroenVannevelアナライザはアセンブリの一部として移動するのですか?言い換えれば、それを作成して複数のソリューションに使用できますか?そうでなければ、少なくとも私が正しい道にいることを確認してくれてありがとう。 – Sinaesthetic

+0

はい、アナライザはナゲットリファレンスとして追加されているので、ソリューションとともにパッケージ化されています –

答えて

1

だけのシンプルなアイデア、パブリックデフォルトコンストラクタのためにあなたはwhere T : new()制約を利用することができあなたが属性を適用している型を提供する必要があり、非公開のコンストラクタでは機能しませんが、コンパイル時にはアドオンを必要とせずに失敗します。

+0

ありがとうございます;私も同様の考えを持っていましたが、実際にはこれらのドメイン集約が公開されることは望ましくありません。私はおそらくこの問題を解決することを望んでいましたが、ローズンの機能についてもっと学びました – Sinaesthetic

関連する問題