কীভাবে অ্যাক্টিভেটরে প্যারামিটারগুলি পাস করবেন re


235

আমি একটি জেনেরিক পদ্ধতিতে যে ধরণের উল্লেখ করেছি তার একটি উদাহরণ তৈরি করতে চাই। এই ধরণের বেশ কয়েকটি ওভারলোডেড কনস্ট্রাক্টর রয়েছে। আমি কনস্ট্রাক্টরদের পক্ষে যুক্তি দিতে সক্ষম হতে চাই, তবে

Activator.CreateInstance<T>()

এটি বিকল্প হিসাবে দেখতে পাচ্ছে না।

এটি করার অন্য কোনও উপায় আছে?


উত্তর:



16

নামযুক্ত পরামিতিগুলির মাধ্যমে ক্রিয়েটইনস্ট্যানসে আর্গুমেন্টগুলি পাস করার আরও একটি উপায় রয়েছে।

তার উপর ভিত্তি করে, আপনি দিকে একটি অ্যারে পাস করতে পারেন CreateInstance। এটি আপনাকে 0 বা একাধিক যুক্তি দেওয়ার অনুমতি দেবে।

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

2
এটি অসম্পূর্ণ বলে মনে হচ্ছে, অবশ্যই আপনার শূন্যতার পরিবর্তে টি টাইপের একটি বস্তু ফেরত দেওয়া দরকার? পাবলিক টি ক্রিয়েটইনস্ট্যান্স <টি> (প্যারাম অবজেক্ট [] প্যারামআরে) {রিটার্ন (টি) অ্যাক্টিভেটর.ক্রেইটইনস্ট্যান্স (টাইপফ (টি), আর্গুমেন্ট: প্যারামআরে); }
wlf

11

অ্যাক্টিভেটর.ক্রিয়েটইনস্ট্যান্সে প্যারামিটারলেস তৈরির তুলনায় পারফরম্যান্সের একটি উল্লেখযোগ্য পারফরম্যান্স রয়েছে বলে মনে রাখবেন।

প্রাক সংকলিত লাম্বদা ব্যবহার করে গতিশীলভাবে বস্তু তৈরির জন্য আরও ভাল বিকল্প রয়েছে। অবশ্যই সর্বদা পারফরম্যান্স বিষয়গত হয় এবং এটি প্রতিটি ক্ষেত্রে এর পক্ষে মূল্যবান কিনা তা স্পষ্টভাবে নির্ভর করে।

এই নিবন্ধে সমস্যা সম্পর্কে বিশদ।

গ্রাফটি নিবন্ধ থেকে নেওয়া হয়েছে এবং প্রতি 1000 কলে এমএসে নেওয়া সময়ের প্রতিনিধিত্ব করে।

পারফরম্যান্স তুলনা


প্রসঙ্গে, এই চার্টটির অর্থ হ'ল (গড় হিসাবে একই হার্ডওয়্যারে) প্রতিটি প্যারামিটারাইজড কনস্ট্রাক্টরের অনুরোধ Activator.CreateInstanceনেওয়া হবে 0.0035ms(বা 3.5 মাইক্রোসেকেন্ড) - আপনার আবেদনের উপর নির্ভর করে এটি এমনকি পারফরম্যান্স-পরীক্ষায় নিবন্ধনও করতে পারে না।
দাই

6

অ্যাক্টিভেটর.ক্রিয়েটআইনস্ট্যান্সের বিকল্প হিসাবে, লিঙ্কযুক্ত ইউআরএল-এ ফাস্টঅবজেক্টফ্যাক্টরি অ্যাক্টিভেটরের চেয়ে ভাল (যেমন নেট নেট 4.0.০ এবং নেট .৩.৫ এর চেয়ে উল্লেখযোগ্যভাবে উন্নত। পরিসংখ্যান, তথ্য এবং কোডের জন্য স্ট্যাক ওভারফ্লো পোস্টটি দেখুন:

কীভাবে অ্যাক্টিভেটর-ক্রিয়েটআইনস্ট্যান্সে কর্টার আরগস পাস করবেন বা আইএল ব্যবহার করবেন?


আপনি কী বোঝাতে চেয়েছেন যে বিকল্প সমাধান (সংযুক্ত) রয়েছে যা অ্যাক্টিভেটর থেকে ভাল পারফরম্যান্সের সম্ভাবনা রয়েছে C বা যে সব ক্ষেত্রে আরও ভাল পারফর্ম করতে পারে?
এল জোরকো

1
আমি কিছুক্ষণের মধ্যে পারফরম্যান্স পরীক্ষা করিনি এবং দেখে মনে হচ্ছে কেউ কেউ নেট। 4.0 পরিসংখ্যান পোস্ট করেছে, তবে হ্যাঁ। নেট 4.0 এর সাথে দেখে মনে হচ্ছে ফাস্টওবজেক্টফ্যাক্টির আরও ভাল পারফরম্যান্স রয়েছে। অ্যাক্টিভেটর.ক্রিয়েটইনস্ট্যান্স .NET 3.5-এ ভয়াবহ ছিল এবং .NET 4.0-তে উল্লেখযোগ্যভাবে দ্রুত ছিল তবে that ইউআরএল-এ সংযুক্ত ফাস্টওবজেক্টফ্যাক্টরির চেয়ে এখনও ধীর ছিল।
থেমস

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
এটি কেবল বর্ণনামূলক কোড। আমি সন্দেহ করি যে এটি আদৌ সহায়তা করে বা এমনকি কাজ করে। আমাকে বোঝানোর জন্য অন্যথায় দয়া করে ব্যাখ্যা করুন যে এটি কীভাবে কাজ করে এবং কেন সমস্যার সমাধান হওয়ার কথা।
ইউনোশচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.