以前SharpLab. – publish notification hooksではpost内容を書き換えられないというエントリをあげた。その時JZ5さんからMSにフィードバックを送りましょう、というコメントを頂いたので、実際にWindows Live Writer Developer Forumsで提起してみたところ、Scøttさんから自エントリの紹介という形でpost内容を書き換えるためのTipsを紹介頂いた。なるほどフィードバックは送ってみるものだ。

さて、その紹介頂いたInsertableContentSource: New Writer Plugins Using The New SDKというエントリは、CTP版の新SDKを使って作られたプラグインを紹介するエントリなのだが、その中で参考になるのは「ScottIsAFool.WriterUtilities」というセクション。エントリの中で紹介されているプラグインを実装するのに使われた、エントリ内容書き換え用のユーティリティクラス(WriterUtilsクラス)の使い方を紹介している。このクラスのソースコードもCodePlexにあげられていたので、以下に抜粋して引用する。

namespace ScottIsAFool
{
    public static class WriterUtils
    {
        public static bool ReplaceText(IPostInfo postInfo, string value, PostItems item)
        {
            PropertyInfo[] propInfos = postInfo.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo pi in propInfos)
            {
                if (pi.Name == item.ToString() && pi.CanWrite)
                {
                    pi.SetValue(postInfo, value, null);
                    return true;
                }
            }
            return false;
        }
    }
}

New Live Writer Plugins (SDK: 1.1)

…何と反応していいのか分からない素敵なnamespace名は措いておくとして。

要するに渡されたIPostInfo型の引数に対して、リフレクションで無理矢理プロパティに値をセットしているようだ。しかし、リフレクションについてよくわかっていないのだが、何で読み取り専用プロパティであるIPostInfoのメンバに値をセットするようなことが出来るのだろう?読み取り専用プロパティである限り、pi.CanWriteの部分は常にfalseを返すのではないのか?ようわからん。

Comments :2

JZ5 08-07-11 01:27:07 JST

おおおなるほど。試してないけど。私もネタにしよう。
Blog、InsertableContentSource もフィードに登録してあるけど全く気付いてなったです……。
リフレクションを使うとなぜ変更できるのかは私もわからないですけど
Privateな変数も書き換えできるので(権限がいるけど一般的につくる・つかうには変更できるはず)
読み取り専用も書き換えできそうですね。CanWriteの戻り値はわからないです。

shiroica 08-07-11 02:38:45 JST

Privateな変数も書き換えできるのですか。
WindowsLiveWriterの方で、内部的な使用に供するためにアクセスレベルを厳しく設定したsetアクセサを用意していたから出来た、とかでしょうか。

Trackbacks : 2

Trackback URL for this entry
http://blog.sharplab.net/computer/cprograming/windowslivewriter/276/trackback/

Listed below are links to weblogs that reference this entry

ピンバック from SharpLab. - 中まで知ろう!Windows Live Writer 08-07-30 02:23:39 JST

[...] インスタンスの、IPostInfoインターフェイスでは読み取り専用になっているプロパティに対してリフレクションで値をセットするコードがなぜ動くのかが分からないとかぼやいていました。 [...]

ピンバック from SharpLab. - publish notification hooksでpost内容を安全に書き換えるには 08-07-31 14:39:07 JST

[...] ひとつ前のエントリ(中まで知ろう!Windows Live Writer)で、Windows Live Writerの、SDKには載っていないクラスを色々と紹介しました。その内容をうけて、このエントリではPublish Notification Hook プラグインで、投稿前に記事内容を書き換える方法を紹介したいと思います。以前にも、SharpLab. – publish notification hooksでpost内容を書き換えるにはというエントリでpublish notification hooksプラグインで投稿内容を書き換える方法を紹介したことがありました。ですが、 WLW 自体は書き換えられることを想定してないので、プラグインから書き換えても投稿後にエディタ中の表示は変化しません。 [...]