我正在使用 CSOM 更新 Project Server 项目的一些任务。
未定义必须更新哪个属性,代码会根据属性名称(如字符串)动态找出要更新的内容。
为了更好地理解,我使用了简化版的代码
//fieldName = "ActualWorkTimeSpan"; value = "16:00:00";
private void Start(string fieldName, string value)
{
DraftTask draftTask = GetDraftTask();
Update(draftTask, fieldName, value);
PublishAndCheckin(draftTask);
}
private static void Update(DraftTask draftTask, string fieldName, string value)
{
// skip updating if field is Equal
if (GetPropValue(draftTask, fieldName).ToString() == value)
return;
// update of the task
SetPropValue(draftTask, fieldName, value);
}
private static object GetPropValue(object src, string propName)
{
return src.GetType().GetProperty(propName).GetValue(src, null);
}
private static void SetPropValue(DraftTask src, string propName, object value)
{
src.GetType().GetProperty(propName).SetValue(src, value);
}
我可以毫无问题地使用 GetPropValue()
,但对于 SetPropValue()
,我需要值的类型正确。
在这种情况下,属性“ActualWorkTimeSpan”的值为“System.TimeSpan”。所以我需要将字符串“15:00:00”转换为 TimeSpan。
如果每次都是 TimeSpan 会很容易做到,但我可能是“成本”字段设置为更新。
Update(draftTask, "Cost", "500");
所以我的问题是是否有可能找出该字段的类型并将我的值转换为相同的类型。
最佳答案
我使用 TypeDescriptor.GetConverter
这需要 Type
并返回 TypeConverter
知道如何转换 string
到指定的 Type
.
然后您可以调用 TypeConverter.ConvertFromString
将字符串转换为所需的 Type
.
您的代码如下所示:
var propType = src.GetType().GetProperty(propName).PropertyType;
var converter = TypeDescriptor.GetConverter(propType);
var convertedObject = converter.ConvertFromString(src);
关于c# - 获取属性Type并将String转换为对应的Type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47331096/