Cách truyền tham số cho Activator.CreateInstance <T> ()


235

Tôi muốn tạo một thể hiện của một loại mà tôi chỉ định trong 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ể truyền đối số cho các nhà xây dựng, nhưng

Activator.CreateInstance<T>()

không thấy điều này là một lựa chọn.

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


Câu trả lời:



16

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

Dựa vào đó, bạn có thể truyền một mảng về phía CreateInstance. Điều này sẽ cho phép bạn có 0 hoặc nhiều đối số.

public T CreateInstance<T>(params object[] paramArray)
{
  return (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ả về một đối tượng thuộc loại T chứ không phải là void? công khai T CreatInstance <T> (params object [] paramArray) {return (T) Activator.CreateInstance (typeof (T), args: paramArray); }
wlf

11

Hãy ghi nhớ rằng mặc dù truyền các đối số trên Activator.CreateInstance có sự khác biệt đáng kể về hiệu suất so với việc tạo tham số.

Có những lựa chọn thay thế tốt hơn cho việc tạo động các đối tượng bằng lambda được biên dịch trước. Tất nhiên luôn luôn hiệu suất là chủ quan và nó rõ ràng phụ thuộc vào từng trường hợp nếu nó có giá trị hay không.

Chi tiết về vấn đề trên bài viết này.

Biểu đồ được lấy từ bài viết và biểu thị thời gian thực hiện trong ms trên 1000 cuộc gọi.

So sánh hiệu suất


Đối với ngữ cảnh, biểu đồ này có nghĩa là (trung bình, trên cùng một phần cứng), mỗi lần gọi của hàm tạo được tham số hóa Activator.CreateInstancesẽ mất 0.0035ms(hoặc 3,5 micro giây) - tùy thuộc vào ứng dụng của bạn, điều này thậm chí có thể không đăng ký trong các bài kiểm tra hiệu năng.
Đại

6

Thay thế cho Activator.CreateInstance, FastObjectFactory trong url được liên kết tạo khuôn tốt hơn Activator (kể từ .NET 4.0 và tốt hơn đáng kể so với .NET 3.5. Không có kiểm tra / thống kê nào được thực hiện với .NET 4.5). Xem bài đăng StackOverflow để biết số liệu thống kê, thông tin và mã:

Làm cách nào để vượt qua ctor args trong Activator.CreateInstance hoặc sử dụng IL?


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 truyền tham số? Hoặc đó có khả năng thực hiện tốt hơn trong mọi trường hợp?
El Zorko

1
Tôi đã không thực hiện các bài kiểm tra hiệu suất trong một thời gian và có vẻ như ai đó đã đăng các số liệu thống kê .NET 4.0, nhưng vâng, với .NET 4.0, có vẻ như FastObjectFactory có hiệu suất tốt hơn. Activator.CreateInstance thật kinh khủng 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

1
public class AssemblyLoader<T>  where T:class
{
    public void(){
        var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll") 
    }

    public T Load(string assemblyFile, string objectToInstantiate) 
    {
        var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();

        return loaded as T;
    }
}

1
Đây là mã không giải thích được. Tôi nghi ngờ rằng nó giúp hoặc thậm chí hoạt động cả. Để thuyết phục tôi bằng cách khác xin vui lòng giải thích làm thế nào điều này hoạt động và tại sao nó được cho là để giải quyết vấn đề.
Yunnosch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.