获取属性类型并将String转换为相应的Type

时间:2017-11-16 13:35:55

标签: c# csom

我正在使用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()

所以我的问题是,是否有可能找出该字段的类型,并将我的值转换为相同的类型。

3 个答案:

答案 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);