我正在使用CSOM更新Project Server项目的某些任务。
未定义必须更新的属性,代码根据属性名称动态找到要更新的内容。
为了更好地理解,我戴了我的代码的简化版
error: ‘pLog’ was not declared in this scope
我可以毫无问题地使用//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()
,我需要将值设置为正确的类型。
在这种情况下,它将是" System.TimeSpan"对于该属性" ActualWorkTimeSpan"。所以我需要转换字符串" 15:00:00"到TimeSpan。
如果每次都是TimeSpan会很容易做到,但我可能会成为Field" Cost"设置为更新。
SetPropValue()
所以我的问题是,是否有可能找出该字段的类型,并将我的值转换为相同的类型。
答案 0 :(得分:6)
我使用TypeDescriptor.GetConverter
获取Type
并返回知道如何将TypeConverter
转换为指定string
的{{1}}。
然后,您可以调用TypeConverter.ConvertFromString
将字符串转换为所需的Type
。
您的代码如下:
Type
答案 1 :(得分:0)
您可以使用Convert.ChangeType方法执行此操作。
private static void SetPropValue(DraftTask src, string propName, object value)
{
var property = src.GetType().GetProperty(propName);
var valueToSet = Convert.ChangeType(value, property.PropertyType);
property.SetValue(src, valueToSet);
}
ref ,在这种情况下无用。它在您在被调用方法中分配参数时使用,并且还在调用站点(调用方法的范围)中分配它。
答案 2 :(得分:0)
最简单的选择是将方法签名更改为通用或采用object
类型,并实际传入正确的数据类型。例如:
private static void Update(DraftTask draftTask, string fieldName, object value)
{
//snip
}
或通用:
private static void Update<T>(DraftTask draftTask, string fieldName, T value)
{
//snip
}
现在你用正确的类型调用它,例如:
var timeSpan = new TimeSpan(...);
Update(ref draftTask, "ActualWorkTimeSpan", timeSpan);