2010-08-10 31 views
6

LINQ chứa các phương pháp Cast mà phôi mỗi mục trong danh sách để gõ T. Cho phép nói rằng chúng tôi có một danh sách mà trông giống như sau:LINQ Cast <T> với System.Type

List<Object> obj = new List<Object>(); 
obj.Add("A"); 
obj.Add("B"); 

Một dàn diễn viên làm việc có thể là

var list = obj.Cast<string>(); 

Những gì tôi muốn làm việc

Type t = typeof(String); 
Object list = obj.Cast(t); 

Một giải pháp sẽ được sử dụng phản ánh và chung chung tạo ra một danh sách và cư nó nhưng tôi đã tự hỏi nếu có tồn tại bất kỳ giải pháp tốt hơn? Nghe nói rằng .NET 4.0 nên hỗ trợ một số co/contra-variance mà có thể là một cách để làm điều đó.


thêm thông tin và Reflection soulution

Các lỗi tôi nhận được là The model item passed into the dictionary is of type System.Collections.Generic.List1[IStatisticEntry], but this dictionary requires a model item of type System.Collections.Generic.List1[CrashStatistic+CrashEntry] sau. Lưu ý rằng CrashEntry thực hiện IStaticEntry nhưng không thể được đúc vì nó là một kiểu chung của danh sách.

tôi xây dựng các giải pháp sau đây qua tôi sẽ stille như một cái gì đó mà không Reflection:

public static object Cast(this IEnumerable list, Type type) 
    { 
     var newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(type)); 

     foreach (var item in list) 
      newList.GetType().GetMethod("Add").Invoke(newList, new object[] { item }); 

     return newList; 
    } 
+0

http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx –

Trả lời

2

Không thể thực hiện điều này một cách tĩnh, hơn bất kỳ đối tượng nào bạn có thể thực hiện với một đối tượng duy nhất.

Type t = typeof(string); 
var x = (t)obj; // invalid 

Tuy nhiên, nó có thể điều trị các yếu tố động để một dàn diễn viên với loại cơ bản là không cần thiết:

static void Main(string[] args) 
{ 
    List<Object> obj = new List<Object>(); 
    obj.Add("A"); 
    obj.Add("B"); 

    var list = obj.Cast<dynamic>(); 
    foreach (var item in list) 
    { 
     Console.WriteLine(item[0]); 
    } 

    Console.ReadKey(); 
} 
+0

Cảm ơn bạn đã trả lời nhưng tôi không nghĩ rằng đó là vấn đề khắc phục. Tôi có một cái nhìn mà hy vọng một mô hình của một loại nhất định và tôi đã nhận các loại như là một tham số. Đã thêm một số thông tin về lỗi trong mô tả sự cố ở trên –

+0

Nếu bạn chỉ có loại thời gian chạy (ví dụ: một phiên bản 'Loại') chứ không phải loại thời gian biên dịch (ví dụ:, một tham số chung ''), thì bạn phải sử dụng sự phản chiếu hoặc 'động' (và bạn phải thay đổi chế độ xem để sử dụng' dynamic'). Vì vậy, sự lựa chọn của bạn là: 1) Sử dụng sự phản chiếu; 2) sử dụng 'dynamic', thay đổi giao diện; 3) Chuyển kiểu như một tham số chung '' thay vì một thể hiện 'Loại'. –

+0

Đủ công bằng, nhờ sự rõ ràng về chủ đề. Với số lượng lỗi đánh máy của tôi, tôi tin rằng cách tốt nhất là giải pháp Reflection để đảm bảo rằng các khung nhìn vẫn hoạt động với các kiểu gõ mạnh :) –

0

Bạn không cần phải bỏ cái gì đó vào loại mà bạn sẽ biết chỉ trong thời gian chạy. Loại đối tượng sẽ không thay đổi bởi vì bạn sẽ thực hiện diễn viên, nếu nó là chuỗi nó sẽ là một chuỗi sau đó và nó không quan trọng nếu bạn sẽ gán nó cho chuỗi hoặc biến đối tượng.

Bạn không cần phải quan tâm đến việc truyền sang loại đối tượng thực trong khi bạn đang vận hành trên phương pháp phản chiếu. Nó có thể tồn tại như một biến đối tượng bởi vì trong khi sử dụng sự phản chiếu, bạn có thể truy cập tất cả các thành viên kiểu thực của nó mà không cần bất kỳ phép đúc nào.

+0

Tôi đã thêm mô tả lỗi ở trên, nghĩ rằng nó đưa ra ý tưởng rõ ràng hơn về ý tôi là gì –

4

Tôi hoàn toàn không hiểu tại sao bạn muốn làm nhưng điều này bạn có thể gọi Enumerable.Cast<T> qua phản ánh:

List<object> objectList = new List<object> { "Foo", "Bar" }; 
object stringSequence = typeof(Enumerable) 
    .GetMethod("Cast", BindingFlags.Public | BindingFlags.Static) 
    .MakeGenericMethod(typeof(string)) 
    .Invoke(null, new[] { objectList }); 

trong trường hợp này, loại thời gian chạy của stringSequence sẽ thực hiện IEnumerable<string>.

+0

+1 Bạn, thưa bạn, vừa là quý ông vừa là một học giả. –

Các vấn đề liên quan