2017-01-20 3 views
0

のリストに変換し、この部分は正常に動作しているが、いくつかのプロパティがコレクションであると私はように見える場合には、私は文字列にコレクションを追加したいですそれに問題がある:カントは、私はプロパティの値を取得またはネストされたプロパティの値を取得しますmethongを持っていますオブジェクト

コード:

public static object GetNestedPropValue<TObject>(TObject obj, string propName) 
{ 
    string[] nestedObjectProp = propName.Split('.'); 
    string[] childProperties = nestedObjectProp.Skip(1).ToArray(); 

    string parentProp = nestedObjectProp.FirstOrDefault(); 

    foreach (string property in childProperties) 
    { 
     if (obj == null) 
     { 
      return null; 
     } 

     PropertyInfo info = obj.GetType().GetProperty(parentProp); 

     if (info == null) 
     { 
      return null; 
     } 

     object nestedObject = info.GetValue(obj); 

     if(childProperties.Count() == 1) 
     { 
      Type checkNestedType = nestedObject.GetType(); 

      if (IsICollection(checkNestedType) && IsIEnumerable(checkNestedType)) 
      { 
       var nestedObjectValues = nestedObject as List<object>; 

       return string.Join(", ", nestedObjectValues 
        .Select(i => i.GetType().GetProperty(childProperties.FirstOrDefault()).GetValue(nestedObject)) 
        .ToArray());     
      } 
      return nestedObject.GetType().GetProperty(childProperties.FirstOrDefault()).GetValue(nestedObject); 
     } 

     GetNestedPropValue(nestedObject, string.Join(".", childProperties.Skip(1))); 
    } 

    return null; 
} 

問題はここにある:私はオブジェクトのリストに入力しようとすると

var nestedObjectValues = nestedObject as List<object>; 

return string.Join(", ", nestedObjectValues 
    .Select(i => i.GetType().GetProperty(childProperties.FirstOrDefault()).GetValue(nestedObject)) 
    .ToArray()); 

それは私にはnullを与え、T思えますo問題がある?

+0

明らか 'nestedObject'は'リスト 'ではありません。この質問は、ソースタイプの定義を知らずに答えられず、ソースプロパティは 'info'と呼ばれます。最も簡単な方法は、デバッガの値を調べることです。 – Lee

+0

try:var nestedObjectValues = nestedObject.ToList(); – jdweng

+0

@jdweng:nestedObjectが明示的にobject'、 'nestedObject.ToListは()' – Falanwe

答えて

2

nestedObjectは、単にList<object>ではないため、nestedObject as List<object>はnullを返します。

コレクション型なので、列挙されては確かに種類はいくつかのT.ためList<T>であることを意味しません。また、その後も、List<T>は(Tがobjectであれば、明らかに除いて)とにかくList<object>に直接キャスト可能ではありません。

私はあなたがここで達成しようとしているかわからないんだけど、緩い推測型にオブジェクトをキャストしようとする前に、反射によって種類を検査することは私には非常に奇妙な感じ。

関連する問題