2010-03-22 30 views
19

Tôi đang cố gắng tạo danh sách một loại nhất định.Tạo danh sách các loại biến

Tôi muốn sử dụng ký hiệu Danh sách nhưng tất cả những gì tôi biết là "System.Type"

Loại có thay đổi. Làm cách nào để tạo danh sách loại biến?

Tôi muốn một cái gì đó tương tự như mã này.

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

Đảm bảo không có thiết kế bị lỗi, vì điều này giống như thiết kế. – Dykam

Trả lời

14

Bạn có thể sử dụng phản ánh, đây là một mẫu:

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[] {}); 
+0

Vấn đề là chúng tôi không biết myType là typeof (int), do đó, tuyên bố cuối cùng của bạn không thể là Danh sách , chúng tôi muốn một cái gì đó như Liar , nhưng tất nhiên không thể thực hiện được. Để tạo cá thể, chúng ta nên sử dụng System.Activator.CreateInstance (myType). Nhưng sau đó một lần nữa, giá trị trả lại nếu một đối tượng kiểu myType. Và bạn phải sử dụng System.Type để tìm hiểu về các phương pháp/thuộc tính/giao diện vv –

+0

Nó có thể được thực hiện bằng cách sử dụng generics: Danh sách CreateMyList (). Bên trong phương thức này bạn có thể làm: Gõ myType = typeof (T); và rồi mọi thứ như trên. Bạn sẽ có thể sử dụng phương pháp như thế này: Danh sách list = CreateList () –

33

Something như thế này nên làm việc.

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

Cảm ơn, điều này đã giải quyết được vấn đề của tôi. – Jan

+0

Tôi đã phải loay hoay với điều này một chút trước khi tôi làm việc đó. Tôi là tổng số người mới sử dụng Type, do đó, đây là đoạn mã người khác có thể thấy hữu ích khi bạn gọi phương thức createList này từ Phương thức chính hoặc một số phương pháp khác: string [] words = {"stuff", "things" , "wordz", "misc"}; var shtuff = createList (words.GetType()); –

+1

Tôi nhận ra điều này là cũ, nhưng @Jan, điều này đã giải quyết được vấn đề của bạn cần được đánh dấu là câu trả lời. @kayleeFrye_onDeck bạn cũng có thể thực hiện 'typeof (string [])' – 182764125216

0

Cảm ơn bạn! Đây là một trợ giúp lớn. Dưới đây là triển khai của tôi cho Khung thực thể:

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); 
    } 
Các vấn đề liên quan