■95086 |
Re[5]: CHARFORMATのデフォルトについて |
□投稿者/ 魔界の仮面弁士 -(2020/06/23(Tue) 07:22:35)
| 2020/06/23(Tue) 07:32:39 編集(投稿者)
■No95085 (VisualC#初心者 さん) に返信 >>作成して頂いたコードですが拡張メソッド化したい場合、 >>SelectionBold等がboolで宣言されてるのでこれをvoidに変えて >>みれば良いのでしょうか?
プロパティを拡張メソッドに変更する場合、setter と getter を別々のメソッドとして提供することになります。
たとえば DataRowExtensions では、 DataRow に対するインデクサの読み書きを ジェネリックな拡張メソッドにするために、 getter と setter のペアが用意されています。
// getter 系の拡張メソッド public static T Field<T> (this DataRow row, string columnName)
// setter 系の拡張メソッド public static void SetField<T> (this DataRow row, string columnName, T value)
※実際にはもっと多くのオーバーロードがあります。 https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowextensions
で、上記 SetField 拡張メソッドの実装は、 row[column] = (object)value ?? DBNull.Value; となっています。
> 構造体のCHARFORMAT/CHARFOMAT2構造体 > の中身とどうリンクさせればいいか思いつかないです。 先のサンプルでは、 public bool SelectionBold { get => GetCharFormat_Masks().HasFlag(CFE.Bold); set => SetCharFormat_Masks(CFM.Bold, value ? CFE.Bold : CFE.None); } としていましたので、これを拡張メソッドにするなら、たとえば public static bool GetSelectionBold (this RichTextBox rtb) => GetCharFormat_Masks(rtb).HasFlag(CFE.Bold); public static void SetSelectionBold (this RichTextBox rtb, bool value) => SetCharFormat_Masks(rtb, CFM.Bold, value ? CFE.Bold : CFE.None); などとします。
上記から呼ばれているヘルパーメソッドとなる private void SetCharFormat_Masks(CFM dwMask, CFE dwEffects) private CFE GetCharFormat_Masks() については、インスタンスメソッドから static メソッドに変更したうえで 引数 RichTextBox rtb を追加しておき、元のサンプルで new HandleRef(this, Handle) としていた箇所を new HandleRef(rtb, rtb.Handle) と書き換えます。 |
|