代码之家  ›  专栏  ›  技术社区  ›  user6193206

获取属性类型并将字符串转换为相应的类型

  •  5
  • user6193206  · 技术社区  · 7 年前

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

    如果每次都是时间跨度的话,这将很容易做到,但我可以说“成本”字段设置为更新。

    Update(draftTask, "Cost", "500");
    

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

    3 回复  |  直到 7 年前
        1
  •  16
  •   Bradley Uffner    7 年前

    我使用 TypeDescriptor.GetConverter 这需要一个 Type 并返回一个 TypeConverter 知道如何转换 string 到指定的 .

    然后你可以打电话 TypeConverter.ConvertFromString 将字符串转换为所需的 类型 .

    您的代码如下所示:

    var propType = src.GetType().GetProperty(propName).PropertyType;
    var converter = TypeDescriptor.GetConverter(propType);
    var convertedObject = converter.ConvertFromString(src);
    
        2
  •  0
  •   DavidG    7 年前

    最简单的选择是将方法签名更改为泛型或采用 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);
    
        3
  •  0
  •   Orel Eraki    7 年前

    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);
    }
    

    裁判 ,在这种情况下是无用的。当您在被调用方法中分配参数,并且在调用站点(调用方法的范围)也分配参数时,会使用它。