2010-03-16 29 views
161

Tôi muốn tạo một thể hiện của một kiểu mà tôi chỉ định theo một phương thức chung mà tôi có. Loại này có một số nhà xây dựng quá tải. Tôi muốn có thể chuyển đối số cho các nhà xây dựng, nhưngCách chuyển các tham số đến Activator.CreateInstance <T>()

Activator.CreateInstance<T>() 

không thấy tùy chọn này là một tùy chọn.

Có cách nào khác để làm điều đó không?

+3

thể trùng lặp của [Activator.CreateInstance - Làm thế nào để tạo ra thể hiện của lớp đó có nhà thầu tham số] (http://stackoverflow.com/questions/1288310/activator-createinstance-how-to-create-instances- of-classes-that-have-paramete) – nawfal

Trả lời

306

Yes.

(T)Activator.CreateInstance(typeof(T), param1, param2); 
6

Để thay thế cho Activator.CreateInstance, FastObjectFactory trong khuôn phôi url liên kết tốt hơn so với Activator (như của .NET 4.0 và tốt hơn so với .NET 3.5. Không kiểm tra/số liệu thống kê thực hiện với cách đáng kể. NET 4.5). Xem StackOverflow bài cho số liệu thống kê, thông tin và mã:

How to pass ctor args in Activator.CreateInstance or use IL?

+0

Bạn có nghĩa là có một giải pháp thay thế (được liên kết) có khả năng hoạt động tốt hơn Activator.CreateInstance khi bạn đang truyền tham số? Hoặc điều đó có khả năng hoạt động tốt hơn trong mọi trường hợp? –

+1

Tôi đã không thực hiện kiểm tra hiệu suất trong một thời gian và có vẻ như ai đó đã đăng số liệu thống kê .NET 4.0, nhưng có với .NET 4.0 có vẻ như FastObjectFactory có hiệu suất tốt hơn. Activator.CreateInstance là khủng khiếp trong .NET 3.5 và nhanh hơn đáng kể trong .NET 4.0 tuy nhiên vẫn chậm hơn FastObjectFactory được liên kết trong url đó. – thames

8

Có một cách khác để vượt qua đối số cho CreateInstance thông qua các thông số được đặt tên.

Dựa trên đó, bạn có thể chuyển mảng tới CreateInstance. Điều này sẽ cho phép bạn có 0 hoặc nhiều đối số.

public void CreateInstance<T>(params object[] paramArray) 
{ 
    (T)Activator.CreateInstance(typeof(T), args:paramArray); 
} 
+2

Điều này có vẻ không đầy đủ, chắc chắn bạn cần trả lại một đối tượng kiểu T thay vì bỏ trống? công khai T CreateInstance (params object [] paramArray) { return (T) Activator.CreateInstance (typeof (T), args: paramArray); } – wlf

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