f# pattern matching with types

后端 未结 5 1214
走了就别回头了
走了就别回头了 2021-01-01 20:31

I\'m trying to recursively print out all an objects properties and sub-type properties etc. My object model is as follows...

type suggestedFooWidget = {
            


        
5条回答
  •  南方客
    南方客 (楼主)
    2021-01-01 21:18

    As others has pointed out, you need to invoke the GetValue member to get the value of the property - the iteration that you implemented iterates over PropertyInfo objects, which are "descriptors of the property" - not actual values. However, I don't quite understand why are you using GetEnumerator and while loop explicitly when the same thing can be written using for loop.

    Also, you don't need to ignore the value returned by the sb.Append call - you can simply return it as the overall result (because it is the StringBuilder). This will actually make the code more efficient (because it enables tail-call optimizataion). As a last point, you don't need ToString in sb.Append(..), because the Append method is overloaded and works for all standard types.

    So after a few simplification, you can get something like this (it's not really using the depth parameter, but I guess you want to use it for something later on):

    let rec printObj (o : obj) (sb : StringBuilder) (depth : int) =
      let props = o.GetType().GetProperties() 
      for propInfo in props do
        let propValue = propInfo.GetValue(o, null)
        match propValue with 
        | :? string as s -> sb.Append(s) 
        | :? bool as c -> sb.Append(c) 
        | :? int as i -> sb.Append(i) 
        | :? float as i -> sb.Append(i) 
        | _ ->  printObj currObj sb (depth + 1) 
    

提交回复
热议问题