C# 转换到/创建新System.RuntimeType(用于Linq到SQL对象)
我有一个数据绑定,当勾选复选框时,设置Linq对象的属性,当取消勾选时,将其设置为null 我遇到的问题是,我正在尝试使用数据绑定,而Linq对象的属性是可为空的类型。以下是我设置对象的方法:C# 转换到/创建新System.RuntimeType(用于Linq到SQL对象),c#,linq,C#,Linq,我有一个数据绑定,当勾选复选框时,设置Linq对象的属性,当取消勾选时,将其设置为null 我遇到的问题是,我正在尝试使用数据绑定,而Linq对象的属性是可为空的类型。以下是我设置对象的方法: protected override void OnParse(ConvertEventArgs cevent) { if ((Boolean)cevent.Value) { cevent.Value = DefaultValue; } el
protected override void OnParse(ConvertEventArgs cevent) {
if ((Boolean)cevent.Value) {
cevent.Value = DefaultValue;
} else {
cevent.Value = null;
}
}
例如,我的Linq对象属性是DateTime,因此我的DefaultValue是DateTime。除非当我达到设定的点时,会出现问题
它不需要DateTime(在cevent.DesiredType中找到),它需要RuntimeType(从locals窗口):
我已尝试将System.DateTime强制转换为以下运行时类型:
cevent.Value = Convert.ChangeType(DefaultValue, cevent.DesiredType);
但这是无效的演员阵容:
mscorlib.dll中发生类型为“System.InvalidCastException”的异常,但未在用户代码中处理
其他信息:从“System.DateTime”到“System.Nullable`1[[System.DateTime,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]的强制转换无效
有人对解决方案有什么想法吗?谢谢
编辑:
我发现这是可行的:
cevent.Value = (System.Nullable<System.DateTime>)DefaultValue;
cevent.Value=(System.Nullable)DefaultValue;
我只需要找到一种更普遍的方法
Edit2:
这也不起作用,因为某些原因,OnParse似乎并没有实际地过滤和更改数据源的dataMember
找出它不起作用的原因:
Nullable<float> f = 12;
f.GetType().Equals(cevent.DesiredType)
Nullable f=12;
f、 GetType().Equals(cevent.DesiredType)
所需类型不等于可空类型,可能在尝试更改其绑定的属性之前,会在某个位置对此进行检查。什么是DesiredType?它声明在哪里,它有什么类型,它设置在哪里?DesiredType是绑定ConvertEventArgs的属性。它不是由我创建的,我假设它是由应用它时的默认绑定构造函数创建的。例如,如果我绑定到复选框上的“Checked”,当它到达“OnFormat”事件时,ConvertEventArgs.PreferedType是布尔值。当涉及到“OnParse”事件时,它是绑定的属性的数据类型,在本例中是Linq对象。我的问题是ConvertEventArgs.PreferedType可为Null且可为Null。显然,Convert.ChangeType无法处理Nullable。我不知道是否有任何内置的东西来做这个转换。可能您需要检测可为null的情况,并在附加的可为null的处理中将Convert.ChangeType包装到layer。我在问题中添加了一个编辑,忽略了强制转换为可为null的困难,DesiredType甚至似乎不是可为null的。它是另一种可为空的类型…:将Sf.GetType()框转换为浮点数。空值未装箱(特殊情况)。f、 GetType()==typeof(float)。cevent.DesiredType将等于typeof(float?)。DesiredType引用System.Type(RuntimeType的基类),但此类型指定了DateTime?。
Nullable<float> f = 12;
f.GetType().Equals(cevent.DesiredType)