2010-03-22 6 views
19

특정 유형의 목록을 만들려고합니다.변수 유형 목록 만들기

나는 목록 표기법을 사용하고 싶지만 내가 아는 모든

유형 A는 변수 가지고 "System.Type"입니다. 변수 유형 목록을 만들려면 어떻게해야합니까?

이 코드와 비슷한 것을 원합니다. 이 같은

Type mytype = typeof (int); 

    Type listGenericType = typeof (List<>); 

    Type list = listGenericType.MakeGenericType(mytype); 

    ConstructorInfo ci = list.GetConstructor(new Type[] {}); 

    List<int> listInt = (List<int>)ci.Invoke(new object[] {}); 
+2

잘못된 디자인이 없는지 확인하십시오. – Dykam

답변

14

당신은 반사를 사용할 수 있습니다, 여기에 샘플입니다.

public IList createList(Type myType) 
{ 
    Type genericListType = typeof(List<>).MakeGenericType(myType); 
    return (IList)Activator.CreateInstance(genericListType); 
} 
+0

문제는 myType이 typeof (int)인지 모르기 때문에 마지막 문이 List 이 될 수 없기 때문에 Liar 과 같은 것을 원하지만 당연히 할 수 없다는 것입니다. 인스턴스를 만들려면 System.Activator.CreateInstance (myType)를 사용해야합니다. 그러나 다시 myType 유형의 객체 인 경우 반환 값. 그리고 System.Type을 사용하여 메서드/속성/인터페이스 등에 대해 알아야합니다. –

+0

제네릭을 사용하여 수행 할 수 있습니다. List CreateMyList (). 이 메소드의 내부에서 할 수있는 작업은 다음과 같습니다. Type myType = typeof (T); 그리고 나서 위와 같은 모든 것. 다음과 같은 메서드를 사용할 수 있습니다. List list = CreateList () –

33

뭔가 작동합니다 :

public IList createListOfMyType(Type myType) 
{ 
    return new List<myType>(); 
} 
+0

감사합니다.이게 내 문제를 해결했습니다. – Jan

+0

작업을 시작하기 전에 이걸 가지고 주위를 둘러 봐야했습니다. 저는 Type을 사용하는 데있어 초보자입니다. 다른 사람들이 Main 또는 다른 메소드에서이 createList 메소드를 호출 할 때 다른 사람들이 도움이 될 수있는 코드 스 니펫은 다음과 같습니다. string [] words = { "stuff", "things" , "wordz", "misc"}}; var shtuff = createList (words.GetType()); –

+1

나는 이것이 오래되었음을 알지만, @Jan,이 것은 답으로 표시되어야하는 문제를 해결했다. @kayleeFrye_onDeck'typeof (string [])'도 할 수 있습니다. – 182764125216

0

고마워요! 이것은 큰 도움이되었습니다. 엔티티 프레임 워크를 구현 한 내용은 다음과 같습니다.

public System.Collections.IList TableData(string tableName, ref IList<string> errors) 
    { 
     System.Collections.IList results = null; 

     using (CRMEntities db = new CRMEntities()) 
     { 
      Type T = db.GetType().GetProperties().Where(w => w.PropertyType.IsGenericType && w.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Entity.DbSet<>)).Select(s => s.PropertyType.GetGenericArguments()[0]).FirstOrDefault(f => f.Name == tableName); 
      try 
      { 
       results = Utils.CreateList(T); 
       if (T != null) 
       { 
        IQueryable qrySet = db.Set(T).AsQueryable(); 
        foreach (var entry in qrySet) 
        { 
         results.Add(entry); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       errors = Utils.ReadException(ex); 
      } 
     } 

     return results; 
    } 

    public static System.Collections.IList CreateList(Type myType) 
    { 
     Type genericListType = typeof(List<>).MakeGenericType(myType); 
     return (System.Collections.IList)Activator.CreateInstance(genericListType); 
    }