Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

Evalの戻り値をメソッドの引数にする場合は明示的にキャストしなければならない

Evalの戻り値をビハインドコードのメソッドの引数にしたいことがあります。
例えば、以下のようなメソッドをマークアップから呼び出す場合です。

/// <summary>
/// コードから表示文字列を取得します。
/// </summary>
/// <param name="value">コード。</param>
/// <returns>変換された文字列。</returns>
protected string ConvertCodeToText(string value) {
    switch(value) {
        case "01":
            return "hoge";
        case "02":
            return "fuga"; 
        default:
            return "piyo";
    }
}

この場合、マークアップを次のように書くと、実行時エラーになります。

<asp:Label ID="Label1" runat="server" Text="<%# ConvertCodeToText(Eval("id")) %>" />

次のように明示的にキャストする必要があります。

<asp:Label ID="Label1" runat="server" Text="<%# ConvertCodeToText((string) Eval("id")) %>" />

DataBinder.Evalメソッドの戻り値がObject型だからですね。

DataBinder.Eval メソッド (Object, String) (System.Web.UI)
実行時にデータ バインド式を評価します。