私は時々あるストアドUserControl
を使用するを持っています。これもシステムに登録しています:Guid
ViewState
Guid.Empty
GuidConverter
public class GuidConverter : System.ComponentModel.GuidConverter {
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
return typeof(IEnumerable<byte>).IsAssignableFrom(sourceType) || base.CanConvertFrom(context, sourceType);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
return destinationType == typeof(byte[]) || base.CanConvertTo(context, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) {
if (value is IEnumerable<byte>) {
return new Guid(((IEnumerable<byte>)value).ToArray());
}
if (value is string) {
if(string.IsNullOrEmpty((string)value)) {
return Guid.Empty;
}
return new Guid((string)value);
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(byte[])) {
return ((Guid)value).ToByteArray();
}
if(destinationType == typeof(string)) {
var g = (Guid)value;
if (g == Guid.Empty) {
return null; //here is the cause of the problem
}
return g.ToString("N");
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
それViewState
Guid
がGuid.Empty
私がこの例外を受け取るときです:
System.ArgumentException: Error serializing value '00000000-0000-0000-0000-000000000000' of type 'System.Guid.' ---> System.ArgumentNullException: Value cannot be null.
Parameter name: value
at System.IO.BinaryWriter.Write(String value)
at System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter writer, Object value)
--- End of inner exception stack trace ---
at System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter writer, Object value)
at System.Web.UI.ObjectStateFormatter.Serialize(Stream outputStream, Object stateGraph)
at System.Web.UI.ObjectStateFormatter.Serialize(Object stateGraph)
at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Serialize(Object state)
at System.Web.UI.Util.SerializeWithAssert(IStateFormatter formatter, Object stateGraph)
at System.Web.UI.HiddenFieldPageStatePersister.Save()
at System.Web.UI.Page.SavePageStateToPersistenceMedium(Object state)
at System.Web.UI.Page.SaveAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
--- End of inner exception stack trace ---
null
上記のコメント行を withに置き換えることでエラーを取り除くことができますがstring.Empty
、そのコンバーターを使用するコードが、その変更と互換性のない方法で 2 つのケースを区別する可能性があります (たとえば、文字列形式をデータベースと別のアプリケーションがその値を読み取り、フィールドが null かどうかに応じて異なる処理を実行する場合があります)。
なぜこれが起こるのですか?
言い換えれば、最終的に の実装を提供する場合TypeConverter.ConvertToInvariantString
、null を返すことができないことを意味しますか? System.Web.dll またはこのメソッドのドキュメントに欠けているバグを見つけましたか?