2014-10-06 2 views
0

다른 목록 유형을 반환하는 방법을 찾으려고합니다.다른 목록 유형을 반환하십시오. C#

이런 식으로 뭔가를 시도,하지만 작동하지 않습니다

public Dictionary<string,object> Data; 

public List<T> ReturnList(string key){ 
    var type = Data[key].GetType().Name; 
    switch(type){ 
     case "Bool":    
      return new List<bool>(); break; 
     case "Int":   
      return new List<int>(); break; 
     case "String": 
     case default: 
      return new List<string>(); break; 
    } 
    return null; 
} 

누구나이 가능 방법을 알고?

참고 : 나는 C#

+0

. 당신은 실제로 무엇을 성취하려고합니까? – David

+0

데이터베이스의 각 데이터 열에 대해 서로 다른 목록 유형을 반환하려고합니다. WebMatrix 쿼리 함수 (IEnumerable 을 사용하고 이미 이와 같은 작업을 수행함)가 async/await를 지원하지 않기 때문에 자체 쿼리 함수를 작성합니다. –

+0

T 타입을 사용할 수 있고 캐스트가 호출자 (fsvo)에게 타입 유효한지 "보증"할 수 있습니다. *는 T를 제공합니다 * – user2864740

답변

2

List<T> 대신 IList을 반환 할 수 있습니다. 나는 당신의 ReturnList를 재정의하고 지금 같이있다 - 여기

public IList ReturnList(string key) 
{ 
    //var type = Data[key].GetType().Name; 
    switch (key) 
    { 
     case "System.Boolean": 
      return new List<bool>(); break; 
     case "System.Int32": 
      return new List<int>(); break; 
     case "System.String": 
      return new List<string>(); break; 
    } 
    return null; 
} 

나는 당신의 사전은 다음과 같이 값이 포함 된 가정 -

var dict = new Dictionary<string, object>() 
{ 
    {"bool", typeof(bool)}, 
    {"string", typeof(string)}, 
    {"Int", typeof(int)} 
}; 

당신은 당신의 필요에 따라 함수를 수정할 수 있습니다.

나는이 같은 .Net Fiddle 콘솔 응용 프로그램에서 테스트 한 -

var type = dict["bool"].ToString(); 
Program prg = new Program(); 
var list = prg.ReturnList(type); 
Console.WriteLine(list); 
+0

유망 해 보입니다. 그래서 그것의 타입을 정의 할 필요가 없다는 것 외에'IList'를 사용하면 어떤 이점이 있습니까? 나는 그것들을 정의하는 것보다 더 많은 프로세스를 소비한다고 가정하고 있는가? –

+0

@ControlFreak :'List '은 컴파일 타임 타입을 알아야하고 IList는 객체의 비 제네릭 컬렉션 인 제네릭 타입입니다. [List ] (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx)의 MSDN을 참조한 경우 목록에 기본 인터페이스 인 'IList'가 구현되어 있습니다. 늦은 답장 죄송합니다. –

1

그것은 조금 이상한 질문에 새로운 해요하지만 난이 생각 D 트릭 : 아직도 유형 검사를 가지고 있지만, 일반의 모든 장점을 이용하여

public List<T> ReturnList<T>(string key){ 
    if (Data[key].GetType() != typeof (T)) 
    { 
     throw new Exception("Invalid data type for key"); 
    } 

    return new Lit<T>(); 
} 

방법.

+0

사용 중에 'T'가 필요하지 않으면 멋지고 컴팩트합니다. –

1

당신은 return 문 후 휴식 및 기본 전에 경우를 작성할 필요가 없습니다. 또한 bool 유형의 이름은 "Boolean"이고 int는 실제로 "Int32"입니다.

public static IList ReturnList(string key) 
    { 
     var type = Data[key].GetType().Name; 
     switch(type){ 
     case "Boolean":    
      return new List<bool>(); 
     case "Int32":   
      return new List<int>(); 
     case "String": 
     default: 
      return new List<string>(); 
     } 
     return null; 
    } 

예 :

, 컴파일시의 형태가 알려져 일관 될 필요가없는 제네릭 작동 방법
 Data = new Dictionary<string, object>(); 
     Data.Add("someBool", true); 
     Data.Add("someInt", 42); 
     Data.Add("someString","test"); 

     IList listString = ReturnList("someString"); 
     IList listInt = ReturnList("someInt"); 
     IList listBool = ReturnList("someString"); 
+0

조언 주셔서 감사합니다, 자바 스크립트 습관을 말할 수 있습니다. 그러나 귀하의 대답은 위의 것과 비슷하기 때문에 유형을 정의 할 필요없이 IList를 사용하면 어떤 이점이 있습니까? 나는 그것들을 정의하는 것보다 더 많은 프로세스를 소비한다고 가정하고 있는가? –

+0

@ControlFreak 정확히 어떤 타입의 ReturnList 함수가 리턴하는지 알지 못하기 때문에 [explicit conversion] (http://msdn.microsoft.com/en-us/library/ms173105.aspx)을 사용하는 대신 객체를 얻을 수 있습니다. 인터페이스의. 희망이 당신에게 도움이됩니다) – oleksandr

관련 문제