2015-01-02 50 views
4

尝试使用反射来更新我的模型的特定属性。 这适用于所有其他类型的我的模型,但类型DateTime的属性除外?设置可为空的日期时间的属性值

代码:

public void UpdateProperty(Guid topicGuid, string property, string value) 
{ 
    var topic = Read(topicGuid); 
    PropertyInfo propertyInfo = topic.GetType().GetProperty(property); 
    propertyInfo.SetValue(topic, Convert.ChangeType(value, propertyInfo.PropertyType), null); 

    topic.DateModified = DateTime.Now; 

    Save(); 
} 

以下错误是在Convert.ChangeType部分抛出:

Invalid cast from 'System.String' to 'System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' 

这又如何解决呢?

更新

得到它与丹尼尔A.白色的解决方案时

代码更新(可能需要一些细化和微调,但它的工作原理):

public void UpdateProperty(Guid topicGuid, string property, string value) 
{ 
    var topic = Read(topicGuid); 

    PropertyInfo propertyInfo = topic.GetType().GetProperty(property); 

    object changedType = propertyInfo.PropertyType == typeof(DateTime) || propertyInfo.PropertyType == typeof(DateTime?) 
      ? DateTime.Parse(value) 
      : Convert.ChangeType(value, propertyInfo.PropertyType); 

    propertyInfo.SetValue(topic, changedType, null); 

    topic.DateModified = DateTime.Now; 

    Save(); 
} 
+2

什么是实际的错误信息,以取代

Convert.ChangeType(value, propertyInfo.PropertyType) 

? –

+0

无效从'System.String'转换为'System.Nullable'1 [[System.DateTime,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]' – Dairo

+8

'您必须使用'DateTime.Parse'或'TryParse'或相关。 –

回答

0

尝试转换价值到日期时间: DateTime.Parse(value);

4

尝试通过

Convert.ChangeType(value, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType) 

(未测试)

+0

看起来像这样的作品...结束OP! :) –