2011-09-01 7 views
0

나는 약간의 규칙으로 으로 변환하고 (object value)을 취하는 방법이 있습니다.IEnumerable <object> from IEnumrable <T>

이러한 규칙 중 하나는 값이 IEnumerable 일 때 관련이 있습니다. 이 경우 내가 열거의 각 항목을 처리 할 필요가 : 물론

public string Convert(object value) 
{ 
    var valuetype = value.GetType(); 
    if (valuetype.GetInterface("IList") != null) 
    { 
     var e = (IEnumerable<object>) value; 
     return e.Count() == 0 ? 
      "" : 
      e.Select(o=>Convert(o)).Aggregate("", (c, s) => c+s); 
    } 
} 

, 값은 예를 들어, List<string> 경우, 라인

var e = (IEnumerable<object>) value;

예외

Unable to cast object of type 'System.Collections.Generic.List`1[System.String]' to type 'System.Collections.Generic.IEnumerable`1[System.Object]'.

를 던져

어떤 아이디어라도 어떻게 없앨 수 있습니까?

+0

컬렉션의 각 항목을 의미합니까? – msarchet

+0

문자열에 함께 참여하고 있습니까? –

+0

4보다 오래된 .net 버전을 사용하고 있습니까? – CodesInChaos

답변

1

뭔가

var e = ((IEnumerable) value).Cast<object>()

처럼 그러나 나는이 법안에 맞는 것 같아요 :

public static string Convert(object value) 
    { 
     if (value is string) 
      return value.ToString(); 

     var data = value as IEnumerable; 
     if (data == null) 
      return string.Empty; // I think you missed this one 

     var e = data.Cast<object>(); 
     return e.Count() == 0 ? 
       string.Empty : 
       e.Select(o => Convert(o)).Aggregate("", (c, s) => c + s); 

    } 
+0

값일 수 있습니다. 불행히도'valuetype.GetInterface ("IEnumerable")! = null도'string'에 대해서입니다. – dmay

+0

물론 테스트되었지만 편집 중이 었습니다. –

+0

위대한 '(IEnumerable 값) .Cast ()'이 (가) 트릭을했습니다. – dmay

0
var e = ((IEnumerable)value).Cast<object>(); 

또한, 문자열 연결에 대한 Aggregate 정말 비용이 많이 드는 - 당신이 StringBuilder 또는 string.Concat 또는 string.Join 대신 사용해야합니다. 또한 c.Count() == 0은 중복됩니다.

return string.Concat((IEnumerable)value).Cast<object>().Select(Convert).ToArray()) 
+0

문제는 값이'IEnumerable '또는 ''또는 무엇이든간에 – dmay

0

분산 만 C# 4.0 인터페이스와 대표의 제네릭 형식 매개 변수에서 지원됩니다.

관련 문제