自定义ValueObject的转换问题

zahuifan 2006-08-26 02:18:46
我有一个自定义的ValueObject Str,用来封装string类型:

public class Str
{
string _stringValue;

protected Str(string arg)
{
_stringValue = arg;
}

public static Str valueOf(string arg)
{
return new Str(arg);
}

public static implicit operator Str(System.String arg)
{
return Str.valueOf(arg);
}

public override string ToString()
{
return stringValue;
}

...
}

当我在VS2005 的WinForm里把属性类型是Str的对象绑定到DataGridView上,并在DataGridView编辑此Cell时,会报错:"从 “System .String到 “myli.system .valueObject.Str”的强制转换无效",可是我明明定义了强制转换操作符(implicit operator Str)了呀。请高手们不吝赐教!!

详细错误信息如下:
“DataGridView 默认错误”对话框
DataGridView 中发生以下异常 :
System FormatException :从 “System .String到 “myli.system .valueObject.Str”的强制转换无效 。 -->
System InvalidCastException :从 “System .String到 “myli.system .valueObject.Str”的强制转换无效 。
在 System .Convert .DefaultToType (IConvertible valu, Type targetType ,IFormatProvider provider )
在 System .String.System IConvertible.ToType (Type type ,IFormatProvider provider)
在 System .Convert .ChangeType (Object value,Type conversionType ,IFormatProvider provider )
在 System .Windows .Forms.Formatter .ChangeType (Object value,Type type ,IFormatProvider formatInfo )
-内部异常堆栈跟踪的结尾 ---
在 System .Windows .Forms.Formatter .ChangeType (Object value,Type type ,IFormatProvider formatInfo )
在 System .Windows .Forms.Formatter .ParseObjectInternal(Object value,Type targetType ,Type sourceType ,
TypeConverter targetConverter ,TypeConverter sourceConverter , IFormatProvider formatInfo, Object
formattedNullValue)
在 System .Windows .Forms.Formatter .ParseObject(Object value, Type targetType ,Type sourceType ,
TypeConverter targetConverter ,TypeConverter sourceConverter , IFormatProvider formatInfo, Object
formattedNullValue,Object dataSourceNullValue )
在 System .Windows .Forms.DataGridViewCell.ParseFormattedValueInternal (Type valueType ,Object
formattedValue, DataGridViewCellStyle cellSty, TypeConverter formattedValueTypeConverter , TypeConverter
valueTypeConverter )
在 System .Windows .Forms.DataGridViewCell.ParseFormattedValue (Object formattedValue, DataGridViewCellStyle
cellSty, TypeConverter formattedValueTypeConverter , TypeConverter valueTypeConverter )
在 System .Windows .Forms.DataGridView .PushFormattedValue DataGridViewCell & dataGridViewCurrentCell,Object
formattedValue, Exception& exception )
要替换此默认对话框,请处理DataError 事件。
...全文
417 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zahuifan 2006-08-26
  • 打赏
  • 举报
回复
to dahuangcuc(黄):
> 注意你的
> public override string ToString()
< {
> return stringValue;
>}
>stringValue少了下划线?

对不起,因为我的代码并没有全部贴出来,Str 类还有一个stringValue属性:
public virtual string stringValue
{
get { return _stringValue; }
}
zahuifan 2006-08-26
  • 打赏
  • 举报
回复
to dahuangcuc(黄):
是的,
string s = "string";
Str str = (Str)s;
没问题。就是绑定到DataGridView后会报错。
zahuifan 2006-08-26
  • 打赏
  • 举报
回复
to Knight94(愚翁)

我是这样做的:
public class Student
{
private Str _name = "";

public Str name
{
get { return _name; }
set { _name = value; }
}
}

IList<Student> students = new List<Student>();
students.Add(...);
DataGridView1.DataSource = students;
dahuangcuc 2006-08-26
  • 打赏
  • 举报
回复
注意你的
public override string ToString()
{
return stringValue;
}
stringValue少了下划线?
dahuangcuc 2006-08-26
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
public class Str
{
string _stringValue;

protected Str(string arg)
{
_stringValue = arg;
}

public static Str valueOf(string arg)
{
return new Str(arg);
}

public static explicit operator Str(System.String arg)
{
return Str.valueOf(arg);
}

public override string ToString()
{
return _stringValue;
}

}
class Program
{
static void Main(string[] args)
{
string s = "string";
Str str = (Str)s;
}
}
}
我用上面的代码试了,没问题.
zahuifan 2006-08-26
  • 打赏
  • 举报
回复
to dahuangcuc(黄):
试了explicit,还是一样的错误。而且implicit也可以进行强制转换吧?
Knight94 2006-08-26
  • 打赏
  • 举报
回复
to 当我在VS2005 的WinForm里把属性类型是Str的对象绑定到DataGridView上,并在DataGridView编辑此Cell时,会报错:"从 “System .String到 “myli.system .valueObject.Str”的强制转换无效",可是我明明定义了强制转换操作符(implicit operator Str)了呀。请高手们不吝赐教!!

是这样的,当发生两次以上的转换的时候,系统不会帮你做的,即使声明了隐式转换。

为了更好地说明,你先说说你如何绑定的
dahuangcuc 2006-08-26
  • 打赏
  • 举报
回复
试试:
Str str=(Str)"string";
dahuangcuc 2006-08-26
  • 打赏
  • 举报
回复
强制的是explicit 吧..不是implicit

17,741

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧