2009-09-21 43 views
8

Tôi có một câu hỏi liên quan đến việc gọi phương thức chung của lớp với tham số kiểu được biết khi chạy.Gọi hàm chung với tham số kiểu được xác định tại thời gian chạy

Cụ thể, mã trông giống như vậy:


FieldInfo[] dataFields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); 

// data is just a byte array used internally in DataStream 
DataStream ds = new DataStream(data); 

foreach (FieldInfo field in dataFields) 
{ 
    Type fieldType = field.FieldType; 

    // I want to call this method and pass in the type parameter specified by the field's type 
    object objData = (object) ds.Read<fieldType>(); 
} 

Read() chức năng trông giống như vậy: mục đích


public T Read() where T : struct 

của chức năng này là để trả lại dữ liệu đọc từ một mảng byte.

Có cách nào để gọi một phương pháp chung trong thời gian chạy như thế này không?

Trả lời

12

Cách đơn giản nhất để xử lý này sẽ được thực hiện một tình trạng quá tải không generic của hàm đọc với một tham số Loại duy nhất:

public object Read(Type t) 

Và sau đó có phiên bản generic gọi phiên bản không-generic:

public T Read<T>() where T : struct 
{ 
    return (T)Read(typeof(T)) 
} 
+0

Cảm ơn bạn đã trả lời, tôi chưa bao giờ xem xét một thay đổi thiết kế đơn giản như vậy. –

+0

Vấn đề của tôi không giống như câu hỏi OP, nhưng bạn đã chứng minh chính xác những gì tôi cần biết. Cảm ơn! – KennyZ

7

Bạn sẽ cần phải xây dựng một MethodInfo và gọi phương thức đọc:

MethodInfo method = typeof(DataStream).GetMethod("Read"); 
MethodInfo generic = method.MakeGenericMethod(fieldType); 
object objData = generic.Invoke(ds, null); 
+0

Cảm ơn Reed lần nữa, sự giúp đỡ của bạn được đánh giá rất cao. –

1

Có lẽ sẽ tốt hơn nếu đi tuyến đường của Lee. Generic là viết tắt của thời gian thiết kế để giữ cho bạn không phải viết mã chung cho nhiều loại khác nhau của các lớp. Tại thời gian biên dịch, mọi cuộc gọi đến một phương thức chung hoặc lớp cơ bản được tạo ra như là một lớp hoàn toàn riêng biệt.

Đơn giản hơn rất nhiều để chỉ bass loại và sử dụng sự phản chiếu, đó là những gì bạn sẽ phải làm anyways.

+0

Đúng, phương pháp của Lee cũng sẽ hiệu quả hơn, vì sự phản ánh bổ sung để lấy MethodInfo sẽ là tính toán bổ sung có thể tránh được bằng phương pháp của anh ta. –

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