個人的備忘録

調べたり思いついたりした事の置き場

2016-01-01から1年間の記事一覧

privateなコンストラクタしか持たないクラスをリフレクションで生成する

テスト等で、Privateなコンストラクタしか持たないクラスを生成したくなることがある。 コンストラクタが引数を取らない場合、Activatorを利用すれば簡単にできる。 class Test { private Test() { } } var obj = (Test)Activator.CreateInstance(typeof(Tes…

ConditionalWeakTableを利用して拡張メソッドに状態を持たせる

拡張メソッドを利用してインタフェースに実装をもたせる場合、インタフェースが公開しているもの以外の状態は利用できない。 が、ConditionalWeakTableを利用することでそれに近いことが実現できる。 class Parameter { public string str { get; set; } } i…

BinaryWriter/Readerとエンディアン変換

.Net FrameworkのBinaryWriter/Readerはビッグエンディアンに対応していない。 ので、ビッグエンディアンを扱う場合はこんな感じで書いていた。 static void Main(string[] args) { using (var stream = new MemoryStream()) using (var writer = new Binary…

Fody.Costuraを利用して複数のアセンブリをまとめ、単一の実行ファイルを作成する

これまで、複数のアセンブリをまとめる場合MicrosoftのILMergeを利用していた。 https://www.microsoft.com/en-us/download/details.aspx?id=17630 ILMergeはコマンドラインツールなので、プロジェクトのビルド後のイベントに実行コマンドを記述して利用して…

独自SynchronizationContextの実装

独自のスレッドでasync/awaitしたかったので、SynchronizationContextを実装する。 class SingleThreadSynchronizationContext : SynchronizationContext { BlockingCollection<Action> queue = new BlockingCollection<Action>(); Thread thread; public SingleThreadSynchr</action></action>…

Console.CancelKeyPressのバグ

.Net Frameworkのコンソールアプリケーションでは、Console.CancelKeyPressイベントにハンドラを登録することでCtrl+Cが押された時の動作をハンドルできる。 そのままプログラムを終了させたくない場合はConsoleCancelEventArgs.Cancelにtrueを設定する。 Co…