即使运算符重载也无法强制转换为字符串
对MyType<string>
类型的属性使用MVC3和StringLength
验证属性MyType<string>
谁的内部值是一个string
,我得到一个异常:
无法投射“MyType”类型的对象来键入“System.String”。
所以我添加了一个运算符重载,这是我的类:
public class MyType<T>
{
public T Value { get; set; }
//...
public static implicit operator string(MyType<T> instance)
{
//Return the internal value of the instance.
return Convert.ToString(instance.Value);
}
}
所以这在理论上应该允许将MyType
转换为String
。 但是,我仍然得到相同的错误,这里是堆栈跟踪:
[InvalidCastException:无法投射'MyType'类型的对象来键入'System.String'。]
System.ComponentModel.DataAnnotations.StringLengthAttribute.IsValid(Object value)+64
System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(Object value,ValidationContext validationContext)+176
System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(Object value,ValidationContext validationContext)+41
System.Web.Mvc.d__1.MoveNext()+267
StringLengthAttribute.IsValid
方法(来自.NET框架,而不是我的代码)正在这样做:
public override bool IsValid(object value)
{
this.EnsureLegalLengths();
int num = (value == null) ? 0 : ((string)value).Length;
return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}
似乎它应该工作,我错过了什么?
变量value
声明为object
类型。 由于基础对象不是string
,因此必须先将其转换为实际类型。 没有从object
定义到其他类型的转换,所以您正在执行的转换有效地告诉编译器,如果不是,则该对象实际上是一个string
。 这实际上是拆箱值类型时必须遵循的相同规则。
通过首先将其转换为您的类型,编译器可以意识到从您的类型到所需的string
类型存在(隐式)转换,并且可以生成相应的指令。
例如,
object obj = new MyObject<string> { Value = "Foobar" };
string x = (string)obj; // fail: obj is not a string
string y = (MyObject<string>)obj; // obj: obj is cast to MyObject<string> and
// an implicit cast to string exists
// to be clearer
string z = (string)(MyObject<string>)obj;
public override bool IsValid(object value)
{
this.EnsureLegalLengths();
int num = (value == null) ? 0 : ((MyType<string>)value).Value.Length;
return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}
不要将它转换为string
,而是转换为MyType<string>
。
改变的代码行反映了这一点:
int num = (value == null) ? 0 : ((MyType<string>)value).Value.Length;
编辑 :不要将MyType<string>
传递给该方法,将MyType<string>.Value
传递给它,以便投射成功。
您正在使用隐式转换,并且您应该执行显式转换,因为框架会明确地转换它。 喜欢这个:
(string)value
你应该添加:
public static explicit operator string(MyType<T> instance)
{
//Return the internal value of the instance.
return Convert.ToString(instance.Value);
}
链接地址: http://www.djcxy.com/p/71061.html