2006年12月21日

ConfigurationProperty属性のDefaultValue の動作が変

  
あるフォーラムにも書いたのですが、自分のブログにも書いておきます。

独自の構成セクションをC#で書いているときに、とても悩みました。
書いたのは、次のようなコード。

public class PrelimConfigElement : ConfigurationElement {
const string cJocCode = "jobCode";
[ConfigurationProperty(cJocCode, DefaultValue = "unknown", IsRequired = true, IsKey = true)]
[StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 10)]
public string JobCode {
get { return (String)this[cJocCode]; }
}
...
}


このコードにおいて、「 DefaultValue = "unknown"」の記述がないと、

System.Configuration.ConfigurationErrorsException: プロパティ 'jobCode' の値が無効です。エラー: 文字列の長さは 1 文字以上でなければなりません。

という例外が発生します。

僕の感覚だと、 IsRequired = true と指定しているのだから、 DefaultValue の指定は不要だと思うんです。
でも、DefaultValueの設定がないとエラーになります。

もちろん、構成ファイルでは、1文字以上の文字列を書いています。

まさか、DefaultValueの設定が必要だとは思わなかったので、時間を無駄に潰してしまいました。
限りなくバグに近い動きだと思います。




この記事へのコメント
"MinLength = 1"を設定しているので、
「エラー: 文字列の長さは 1 文字以上でなければなりません。」が出るのだと思います。
MinLengthを設定していないとDefaultValue宣言無しでも大丈夫です。

私も罠にはまっていました・・・。
Posted by takuto at 2009年04月23日 16:25
takuto さん

情報ありがとうございます。
ああ、そういうことですね。
まだまだ、修行が足りないです。
Posted by Gushwell at 2009年04月23日 21:32
ConfigurationPropertyで、探していたらGushwellさんのBlogが
ヒットしました。
IsRequired の必要性がわからなかったので、助かりました。

ちなみに、DefautValueは必須ではないですね。
MinLengthやStringValidatorの設定が良くなかっただけのように
見受けました。
Posted by けろ-みお at 2010年03月12日 17:44
お役に立てて何よりです。

DefaultValueの件は、
たぶん、configを読み込む前に(初期化した時点で)Validatorが
動作するという仕様(?)だからですね。
IsRequired が Trueならば、読み込んだときだけ、Validatorが
動くような仕様のほうが、利用者に優しい仕様だと思うんですが、
残念ながら、そうなっていないみたいです。

MinLength=0にするわけにもいかないし...

そういうもんだと思って諦めてます。
Posted by Gushwell at 2010年03月12日 18:31
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50669714