3

ファイルベースの操作を行うカスタム NAnt タスクを作成しようとしています。非常に便利なことの<expandproperties> 1 つは、入力ファイルの 1 つでフィルターを実行できることです。

タスクを適切に汎用的に保つために、要素のサポートを有効にしたいだけです<filterchain>(タスクの仕組みと同様<copy>)。

私は<copy>タスクのソースをガイドとして使用してきましたが、タスクの作成に関しては内部的なメソッドに出くわし続けています。リフレクションを使用してカプセル化を解除できることはわかっていますが、これを行うのは気が進まないです。

役に立つ記事を知っている人、またはこれに関する経験がある人はいますか?

4

1 に答える 1

1

私は、TextReaderを使用するプライベートFilterサブクラスを作成する道を歩み始めました(基本的に、NAntソース内にPhysicalTextReaderを再作成します)。しかし、実際には、フィルターチェーンを介してファイルを読み取るはるかに簡単な方法があることに気付きました。

[TaskName("mytask")]
public class MyTask : Task
{
    /// <summary>
    /// Chain of filters used to alter the input file's content as it is read.
    /// </summary>
    [BuildElement("filterchain")]
    public FilterChain Filters { get; set; }

    /// <summary>
    /// The input file.
    /// </summary>
    [TaskAttribute("input")]
    public FileInfo InputFile { get; set; }

    protected override void ExecuteTask()
    {
        Log(FileUtils.ReadFile(InputFile.FullName, Filters, null));
    }
}

次に、これを期待どおりに使用できます。

<mytask input="foo.txt">
    <filterchain>
        <expandproperties />
    </filterchain>
</mytask>
于 2012-10-31T10:05:15.313 に答える