2014-12-12 4 views
2

파일에 수신되는 입력 문자열이 있습니다. 여기에는 몇 개의 값이 들어 있습니다. 예. 1; 2; 3캐스트 목록 알 수없는 유형

목록으로 변환하고 싶습니다. 이 속성은 리플렉션에 의해 검색되므로 수정 목록 유형이 없습니다.

간단히 말해서 : 입력으로 나는 PropertyInfo (PropertyType)와 문자열 값을 가지고 있습니다. "PropertyType"유형의 목록을 출력으로 가져 오려고합니다.

이 난에 목록을 할당 할 수없는, 여기

private List<object> GetAsList(Type propertyType, string value) 
    { 
     List<object> list = new List<object>(); 
     var items = value.Split('|'); 
     foreach (var item in items) 
     { 
      list.Add(Convert.ChangeType(item, propertyType.GetGenericArguments().Single())); 
     } 
     return list; 
    } 

같은 문제를 일을하고 싶습니다() 목록을 말할 수 있습니다. 다음과 같이 사용할 수 있습니다.

if(propertyType == typeof(List<Int32>) 
list = new List<Int32>(); 
else if(propertyType == typeof(List<Int64>) 
    list = new List<Int64>(); 
[...] 

내 의견으로는 좋은 해결책이 아닙니다. 이 문제를 해결하는 방법을 알고 있습니까?

+0

'에 대한'목록 ''당신이 –

답변

4

당신의 방법은 일반적인 확인 :

private List<T> GetAsList<T>(string value) 
{ 
    List<T> list = new List<T>(); 
    var items = value.Split('|'); 
    foreach (var item in items) 
    { 
     list.Add((T)Convert.ChangeType(item, typeof(T))); 
    } 
    return list; 
} 

을 그리고 다음과 같이 사용 : 당신이 컴파일시에 유형을 모르는 경우

List<int> listOfInt = GetAsList<int>("1|2|3"); 
List<long> listOfLong = GetAsList<long>("5|6|7"); 
List<double> listOfDouble = GetAsList<double>("1.1|2|3.3"); 

, 당신은 반사를 사용하여 GetAsList를 호출 할 수

var propTypeDouble = typeof(List<double>); 
var listOfDoubleRuntime = typeof([DelaringType]) 
         .GetMethod("GetAsList") 
         .MakeGenericMethod(propTypeDouble.GetGenericArguments().First()) 
         .Invoke(null, new[] {"1.1|2.2|3.3"}); 
+0

그것을 사용하는 방법 GetMethod에 대한 힌트를 주셔서 감사합니다 -> 이것은 내가 찾고있는 것입니다. 스위치에서 타입을 검사하는 것보다/런타임에서 일반적인 메소드를 사용하는 것이 더 좋은 솔루션이라고 생각합니다. –

0

가능하면 다른 사람들이 추천 한대로 일반적인 방법으로 만들 겠지만, 그렇지 않은 경우 sible,이 같은 Type 매개 변수를 사용하여 인스턴스를 만들 수 있습니다

Type targetType = typeof(List<>).MakeGenericType(propertyType); 
IList result = Activator.CreateInstance(targetType); 
0

당신은 다음과 같은 것을 사용한다 -

 private static List<T> GetAsList<T>(string value) 
     { 
      List<T> list = new List<T>(); 
      var items = value.Split('|'); 
      foreach (var item in items) 
      { 
       TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); 
       if (converter != null) 
       { 
        list.Add((T)converter.ConvertFrom(item)); 
       } 
      } 
      return list; 
     } 

을 그리고 같은 소비 -

 List<Int32> demoList = new List<Int32>(); 

     demoList = GetAsList<Int32>("1|2|5|7"); 
0

목록 < T > 목록;

은 인스턴스를 만들 때까지 익명 형식입니다.

목록 < dynamic> list; 은 항상 당신의 인스턴스

목록 < 동적> 목록 = 새로운 목록을 만든 후에도 동적 타입 < 동적>()