【发布时间】:2017-11-16 13:35:54
【问题描述】:
我正在使用 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");
所以我的问题是是否有可能找出该字段的类型,然后将我的值转换为相同的类型。
【问题讨论】:
-
为什么需要它的类型正确?
SetValue无论如何都采用object类型。 -
另外,我认为您不了解
ref关键字的作用,我建议您也阅读一下。 -
一开始你的所有数据都是字符串的原因是什么?
-
您能否澄清一下您是要解析字符串值还是其他方式?另外,为什么要使用反射?
-
@RandRandom - 你是完全正确的。但是,如果 OP 可以做到这一点,他们真的不应该使用反射。我只能假设字段名在下拉列表或配置文件中,
Update(ref draftTask, "ActualWorkTimeSpan", "15:00:00");只是一个示例