วิธีการส่งพารามิเตอร์ไปยัง Activator.CreateInstance <T> ()


236

ฉันต้องการสร้างตัวอย่างของประเภทที่ฉันระบุในวิธีการทั่วไปที่ฉันมี ประเภทนี้มีคอนสตรัคเตอร์ที่โอเวอร์โหลดจำนวนมาก ฉันต้องการที่จะสามารถส่งผ่านข้อโต้แย้งไปยังผู้สร้าง แต่

Activator.CreateInstance<T>()

ไม่เห็นว่ามีตัวเลือกนี้

มีวิธีอื่นที่จะทำหรือไม่


คำตอบ:



16

มีวิธีอื่นในการส่งผ่านอาร์กิวเมนต์ไปยัง CreateInstance ผ่านพารามิเตอร์ที่มีชื่อ

CreateInstanceขึ้นอยู่กับว่าคุณสามารถส่งผ่านอาร์เรย์ต่อ สิ่งนี้จะช่วยให้คุณมี 0 หรือหลายอาร์กิวเมนต์

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

2
ดูเหมือนจะไม่สมบูรณ์แน่นอนคุณต้องส่งคืนออบเจ็กต์ประเภท T แทนที่จะเป็นโมฆะ? สาธารณะ T CreateInstance <T> (วัตถุ params [] paramArray) {return (T) Activator.CreateInstance (typeof (T), args: paramArray); }
wlf

11

โปรดทราบว่าการส่งผ่านอาร์กิวเมนต์บน Activator.CreateInstance มีความแตกต่างด้านประสิทธิภาพที่สำคัญเมื่อเทียบกับการสร้างแบบไม่มีพารามิเตอร์

มีทางเลือกที่ดีกว่าสำหรับการสร้างวัตถุแบบไดนามิกโดยใช้แลมบ์ดาที่รวบรวมไว้ล่วงหน้า แน่นอนประสิทธิภาพการทำงานเป็นเรื่องส่วนตัวและชัดเจนขึ้นอยู่กับแต่ละกรณีว่ามันคุ้มค่าหรือไม่

รายละเอียดเกี่ยวกับปัญหาในบทความนี้

กราฟถูกนำมาจากบทความและแสดงเวลาที่ใช้ใน ms ต่อการโทร 1,000 ครั้ง

การเปรียบเทียบประสิทธิภาพ


สำหรับบริบทแผนภูมินี้หมายความว่า (โดยเฉลี่ยบนฮาร์ดแวร์เดียวกัน) แต่ละการเรียกใช้งานของคอนสตรัคเตอร์แบบพารามิเตอร์Activator.CreateInstanceจะใช้เวลา0.0035ms(หรือ 3.5 ไมโครวินาที) - ขึ้นอยู่กับแอปพลิเคชันของคุณซึ่งอาจไม่ได้ลงทะเบียนในการทดสอบประสิทธิภาพเลย
Dai

6

เป็นทางเลือกแทน Activator.CreateInstance, FastObjectFactory ใน url ที่เชื่อมโยง preforms ดีกว่า Activator (ตั้งแต่. NET 4.0 และดีกว่า .NET 3.5 อย่างมีนัยสำคัญไม่มีการทดสอบ / สถิติที่ทำกับ. NET 4.5) ดูโพสต์ StackOverflow สำหรับสถิติข้อมูลและรหัส:

จะส่ง ctor args ใน Activator.CreateInstance หรือใช้ IL ได้อย่างไร


คุณหมายความว่ามีทางเลือกอื่น (เชื่อมโยง) ซึ่งมีแนวโน้มว่าจะทำงานได้ดีกว่า Activator.CreateInstance เมื่อคุณผ่านพารามิเตอร์ หรือว่ามีแนวโน้มที่จะทำงานได้ดีขึ้นในทุกกรณี?
El Zorko

1
ฉันไม่ได้ทำการทดสอบประสิทธิภาพมาระยะหนึ่งแล้วดูเหมือนว่ามีคนโพสต์สถิติ NET 4.0 แต่ใช่ด้วย. NET 4.0 ดูเหมือนว่า FastObjectFactory จะมีประสิทธิภาพดีกว่า Activator.CreateInstance น่ากลัวใน. NET 3.5 และเร็วกว่าอย่างมากใน. NET 4.0 แต่ยังช้ากว่า FastObjectFactory ที่ลิงก์ใน url นั้น
แม่น้ำเทมส์

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
นี่คือรหัสไม่ได้อธิบายเท่านั้น ฉันสงสัยว่ามันช่วยหรือทำงานได้เลย หากต้องการโน้มน้าวใจฉันเป็นอย่างอื่นโปรดอธิบายวิธีการทำงานนี้และสาเหตุที่ควรแก้ไขปัญหา
Yunnosch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.