2012-03-12 26 views
14

Phương pháp chung là ...C#: Nhận tham số kiểu trong thời gian chạy để vượt qua thành một phương pháp Generic

public void PrintGeneric2<T>(T test) where T : ITest 
    { 
     Console.WriteLine("Generic : " + test.myvar); 
    } 

Tôi gọi này từ Main() ...

Type t = test2.GetType();  
    PrintGeneric2<t>(test2); 

tôi nhận lỗi "CS0246: không thể tìm thấy loại hoặc tên không gian tên 't'" và "CS1502: tốt nhất phương thức quá tải phù hợp DoSomethingClass.PrintGeneric2 < t> (T) có đối số không hợp lệ"

điều này liên quan đến câu hỏi trước của tôi đây : C# : Passing a Generic Object

Tôi đã đọc rằng loại chung không thể được xác định trong thời gian chạy, mà không sử dụng phản ánh hoặc methodinfo, nhưng tôi không rõ ràng về cách thực hiện trong trường hợp này.

Cảm ơn nếu bạn có thể soi sáng cho tôi =)

Trả lời

0

Chỉ cần gọi:

PrintGeneric2(test2); 

Trình biên dịch sẽ suy ra <t> từ những gì bạn vượt qua.

+1

đề xuất của bạn sẽ buộc trình biên dịch suy ra T là System.Type. Tôi không nghĩ rằng điều đó sẽ phản ánh đúng ý định OP của việc vượt qua một thời gian chạy được đánh giá loại –

+0

@AZ, không, nó sẽ không. Bỏ qua phần 'Type t = test2.GetType()' hoàn toàn, không cần thiết ở đây. 'test2' thực hiện' ITest' (xem câu hỏi trước của anh). Thông qua 'test2' as-is, là đủ ở đây. –

+0

Đủ công bằng. Đã không kiểm tra các câu hỏi khác vì vậy tôi đã thiếu bối cảnh của test2. Tôi vẫn đứng trước giả định rằng OP muốn giải quyết T một cách tự động vào thời gian chạy bằng cách nào đó và đó không phải là những gì generics dành cho –

6

Phiếu mua hàng Generics Thời gian biên dịch Đa hình tham số. Bạn đang cố gắng sử dụng chúng với một loại chỉ được chỉ định tại Thời gian chạy. Câu trả lời ngắn: nó sẽ không hoạt động và nó không có lý do gì (ngoại trừ sự phản chiếu nhưng đó là một con thú hoàn toàn khác).

26

Nếu bạn thực sự muốn gọi một phương pháp chung sử dụng một số loại không xác định tại thời gian biên dịch, bạn có thể viết một cái gì đó như:

typeof(YourType).GetMethod("PrintGeneric2").MakeGenericMethod(t).Invoke(instance, new object[] { test2 }); 

Tuy nhiên, như đã nói bởi phản ứng khác, Generics thể không phải là giải pháp tốt nhất trong trường hợp của bạn.

+0

Đây là một ví dụ rất tốt về cách gọi một phương thức chung khi bạn có kiểu thời gian chạy, nhưng OP không thực sự cố gắng làm điều này trong ví dụ của mình. Câu trả lời của @ Moo-Juice giải quyết chính xác câu hỏi của OP. Tuy nhiên, 1 bởi vì tôi đã đến câu trả lời này nhiều lần khi tôi cần nó cho kịch bản "kiểu thời gian chạy như một tham số chung" này. ;) – JMD

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