Pdfをc#で作りたい

とあるシステムで帳票をテンプレートから生成する機能を作ろうと思ったので、
いろいろ調べていると、ThinReportsという便利そうなアプリがあることを知りました。

rubyがあれば使えるらしいのですが、せっかくなのでpdfを勉強してc#で
ThinReportsのテンプレートファイルから生成できるような仕組みを作りたいと考えました。
それがこれ(https://github.com/223n/PDFCnet)なのですが、
まだまだ足りない機能などがあり、かなり修正が必要だなぁと感じています。
また、AdobeReaderなどで開くと保存ダイアログが表示されてしまい、
正常に生成できていないと思われます。
いつかは完成させたいと思いながら、少しずつ頑張っていきたいと思います。

テストコードの実装

テストコードはちょっとした修正結果の担保を簡単に取ることができる非常に心強い味方です。

しかし、テストコードをいざC#で書いていると、少し困ったことに遭遇してしまいました。

まず、現在のVisualStudioでは、テスト用のプロジェクトを作成して、対象のプロジェクトを参照します。

そのため、通常はテスト対象のメソッドなりプロパティは、外部から触れるpublicなどに限られてしまい、

privateは外部からアクセスしてのテストはできません。

(* 日本という国は恐ろしいもので、動的参照を用いて参照しているexeやdll内のprivateなメソッドやプロパティ、

フィールドを参照して書き換え、テストするぜヒャッハーな悪用できちゃうような技術を作ってしまう人も居るわけで…)

では、外部からアクセス可能な範囲でテストをしようとするのですが、

通常、publicを避けているのでテストしたいメソッドがprivateだったりして拡張メソッドや困ってしまいます。

(* 先の動的参照によるテストもありますが、動的参照はインテリセンスを殺してしまい、

非常に保守性が低下しがちで、誰も引き継げなくなってしまうという以前に、ナイワーを感じる今日この頃。)

自分自身、このテストの実装という経験や知識が弱いと感じているのですが、

いい資料はないものでしょうか…

C#のobject型でBool型チェック

先日行われた2016年10月度の勉強会にて、
RubyやPythonでのbool型チェックが簡単にできないというネタがありました。

そこで、C#ではどうだったかなと思い試してみました。

// 実装

今回は、拡張メソッドでobject型にIsBoolというbool型かどうかを確認できるように実装してみました。

Ref. MSDN 拡張メソッド (C# プログラミング ガイド)
Ref. MSDN is (C# リファレンス)

public static bool IsBool(this object obj)
{
return (obj is bool);
}

さて、これで完成です。
実際に使う場合は、下記のようなコードになります。

object obj = new object();
bool result = obj.IsBool(); // false

// 実行結果

実際に実行してみた結果が下図です。

Bool型かどうかの判定

// まとめ

ということで、何もなく実装できてしまいました。

C#では、言語側で“obj is type”“objがnull以外でtype型と互換性があるかどうか”
bool型で返してくれるというありがたい機能が実装されているため、問題になりませんでしたが、
他の言語だとこういう問題もあるんだなと改めて言語間の違いを感じました。

わざわざ拡張メソッドなんて定義しなくてもよかったのですが、まぁ、何事も経験だと思いますで…

また、今回の実装によってobject型に対しても拡張メソッドが実装できる、
ということを新たに知ることができました。

今まで試したことがなかったのですが、これならあの忌々しいDBNullチェックも

obj.IsDBNull()

obj.IsDBNullOrNothing()

のように実装できるんですねぇ。

DataGridViewを改造してみる

行ヘッダに日付を描画、列ヘッダの上にヘッダを追加してそれを結合させてみた話です。

DataGridViewを少し改造してみました!という小ネタです。

000003

Source:  https://github.com/223n/HiStudy/tree/master/MergeGridView2

行ヘッダに日付を描画、列ヘッダの上にヘッダを追加してそれを結合させてみました。

プロジェクトには、MergeGridView2とSampleの2プロジェクトが含まれています。
MergeGridView2は、改造したGridView本体があり、
Sampleでは、MergeGridview2を実際に配置した結果です。

CellPaintイベントやPaintイベントをトリガーに、
UpdateHeaderメソッドでは、列ヘッダを描画しており、
UpdateCellメソッドでは、行ヘッダを描画しています。

ところで、この記事を書く際にVisualStudioを更新したり再起動していたのですが、

123

なんと、メソッド等の1行上に参照数と、参照状況が確認できる機能が自動更新で追加されていたようです。

拡張メソッドの実装について

VB.NETとC#での拡張メソッドの実装方法について

とあるプロジェクトに参加している際に、以下のようなクラスがありました。

CommonExtentionClass

「やべぇ、ちゃんと拡張メソッド使ってやがる!!(VB.NETで)」
という興奮も束の間

Public Shared Function TimeToInt(ByVal pDate As Date) As Integer

それ、拡張メソッドちがうよ… (´;ω;`)

ということで、おさらいも兼ねて、VB.NETとC#での拡張メソッドの実装方法について書いていきます。

参考資料は以下のMSDNをご参照ください。

Ref. 拡張メソッド (Visual Basic) – MSDN

Ref. 拡張メソッド (C# プログラミング ガイド) – MSDN

“拡張メソッドの実装について” の続きを読む

ひっそりとC#のオレオレ開発ルールを公開しました

C#の開発ルールをGitHubで公開したというお知らせです。

この度、めでたく(?)前回の姫路IT系勉強会で発表した
C#開発ルールをGitHubにて公開することができました。

https://github.com/223n/CSharpRules/blob/master/CSharpRules_JP.md

著作権については、クリエイティブコモンズのCC-BYを適用しています。
というのも、今回公開したものを参考に、皆さんで独自のルールを作るきっかけに
なってくれればと思った次第です。

“ひっそりとC#のオレオレ開発ルールを公開しました” の続きを読む

MCP受験してきました

MCPを受験してきた話です。

先日、MCP(C#によるプログラミング)を受験してきました。

1度目は失敗しましたが、2度目の今回は無事に合格しました!

MCPの試験内容等については書けないので、
内容に触れない程度に感想を書きたいと思います。

まず、やったこととしては、
公式ページにある出題範囲をざっと見て、ビデオを視聴。

そこから、知らない単語などを洗い出して、実際にやってみる。

という繰り返しでした。
(赤本など無いので、1度目は完全に手探り状態でした)

また、元が英文なためか、所々訳文や出題内容の一部がおかしいこともあり、
全体的に落ち着いて本文を読み解く必要があるように感じました。
(え、焦って回答してミスするのは自分だけ?そうですね)

よく早とちりしてしまう自分にとっては、落ち着いていれば
無駄な混乱をせずに回答できたのになぁ、という問題がいくつかありました。
(2回目だったので落ち着いたのでしょうか?)

そのため、2度目はポイントを押さえて復習が出来ていたので、
30分ほどで解けてしまいました。
(そのポイントが分かるまで、苦労しましたが)

ただ、MCPを取得しても、まだ認知度が低いみたいで、
周囲では知らない人が多く感じました。
(取っても、報奨金とか資格手当みたいなのもありませんし…それどころか、やり過ぎと言われる始末….)

いずれにせよ、今後もちまちまとC#の話がかければなと思ってます。

今回はここまでです!

ASP.NETでの入力チェックの手法

意図しないデータが入れられる可能性があるというのは、ASP.NETなどのWEBアプリに限らず、どのようなアプリであれ存在します。
開発では入力チェックを行う必要は発生します。
それは、通信を行うからには必ず発生するものであり、手間がかかるものです。
今回は、ASP.NET(c#)での入力チェックについて、頭のなかを整理してみました。

“ASP.NETでの入力チェックの手法” の続きを読む