আমি অ্যাক্টিভেটর ব্যবহার করতে পারি। একটি ইন্টারফেসের সাথে তৈরি করুন?

আমার একটি উদাহরণ আছে:

        Assembly asm = Assembly.Load("ClassLibrary1");
        Type ob = asm.GetType("ClassLibrary1.UserControl1");
        UserControl uc = (UserControl)Activator.CreateInstance(ob);
        grd.Children.Add(uc);

সেখানে আমি একটি ক্লাস একটি উদাহরণ তৈরি করছি, কিন্তু কিভাবে একটি ইন্টারফেসের একটি ক্লাস একটি দৃষ্টান্ত তৈরি করতে পারেন? i.e. UserControl1 প্রয়োগগুলি আইলুড ইন্টারফেস।

U: I can cast object to interface later, but I don't know which type in the assemblies implements the interface.

0
আপনি একটি ইন্টারফেস একটি উদাহরণ তৈরি করতে পারবেন না; আপনি ইন্টারফেস বাস্তবায়ন ক্লাস তৈরি করতে পারেন এবং ইন্টারফেস হিসাবে এটি পাস।
যোগ লেখক Marco, উৎস
আপনি কোনও আইওএলএডের বস্তুকে সূচিত করতে পারবেন না, এটি একটি ইন্টারফেস।
যোগ লেখক JustinDanielson, উৎস

6 উত্তর

এই কিছু কোড আমি কয়েক বার ব্যবহার করেছেন। এটি একটি নির্দিষ্ট ইন্টারফেস বাস্তবায়ন একটি সমাবেশে সব ধরনের খুঁজে পাওয়া যায় নি:

Type[] iLoadTypes = (from t in Assembly.Load("ClassLibrary1").GetExportedTypes()
                     where !t.IsInterface && !t.IsAbstract
                     where typeof(ILoad).IsAssignableFrom(t)
                     select t).ToArray();

তারপর আপনার ClassLibrary1 সব ধরনের আছে যে আইলড প্রয়োগ করে।

তারপর আপনি তাদের সব তাত্পর্যপূর্ণ হতে পারে:

ILoad[] instantiatedTypes = 
    iLoadTypes.Select(t => (ILoad)Activator.CreateInstance(t)).ToArray();
0
যোগ
আমি কিভাবে নিক্ষেপ করতে পারেন, ইন্টারফেস জেনেরিক আইওএল <> ????
যোগ লেখক barteloma, উৎস
ধন্যবাদ, ভাল সমাধান
যোগ লেখক Arman Hayots, উৎস
আমি নিম্নোক্ত ত্রুটি পেয়েছি: উৎস সিস্টেমের জন্য ক্যোয়ারী প্যাটার্নের একটি বাস্তবায়ন খুঁজে পাওয়া যায়নি। সিস্টেম। রিফ্লেকশন। 'কোথায়' পাওয়া যায় নি।
যোগ লেখক dotNET, উৎস
এটি পাওয়া। লোড ("ClassLibrary1") উপরের কোডটিতে অনুসরণ করা উচিত। GETExportedTypes ();
যোগ লেখক dotNET, উৎস
@ ডটনেট হ্যাঁ এই কলটি হওয়া উচিত। আমি এখন এটি যোগ করেছি।
যোগ লেখক Botz3000, উৎস
@ বুকমার্কার আপনি ঢালাই করার জন্য টাইপ প্যারামিটার জানা প্রয়োজন। আপনি যদি না জানেন যে, আপনি একটি অ-জেনেরিক বেস ইন্টারফেস ব্যবহার করতে পারেন। জেনেরিক ক্লাস বা ইন্টারফেসগুলি যদি আপনি টাইপ প্যারামিটার না জানেন তবে এখন আর ব্যবহার করা সহজ নয়।
যোগ লেখক Botz3000, উৎস
হাই। একটি পোর্টেবল ক্লাসে এটি কিভাবে কোন ধারণা? 'টি' কে ইফেক্ট বা আইজ্যাব্রেট বলে মনে হচ্ছে না। আমি একটি পোর্টেবল ক্লাস লাইব্রেরি প্রকল্পের ভিতরে একটি ইন্টারফেস থেকে একটি ঘটনা সক্রিয় করার চেষ্টা করছি যাতে আমি Xamarin এর ভিতরে ব্যবহার করতে পারেন।
যোগ লেখক shahar eldad, উৎস

আপনি একটি ইন্টারফেস উদাহরণ না তৈরি করতে পারেন, কিন্তু যদি

UserControl1 ইলআড ইন্টেফেজ প্রয়োগ করে

you can use resulting object as ILoad

ILoad uc = (ILoad)Activator.CreateInstance(ob);
grd.Children.Add(uc);

উপরন্তু, আপনি এটি ইন্টারফেস মাধ্যমে আচরণ করার প্রয়োজন হবে না, যদি আপনি লিখুন

UserControl1 uc = (UserControl1)Activator.CreateInstance(ob);
grd.Children.Add(uc);

Members of ILoad would be callable as uc.SomeILoadMethod();

0
যোগ
ঠিক আছে, তবে কিভাবে আমি সমাবেশে টাইপ পেতে পারি, যা আইলুড প্রয়োগ করে?
যোগ লেখক Arman Hayots, উৎস
প্রদান করা ওব </কোড> এখনও একটি প্রকার প্রতিনিধিত্বকারী একটি ধরন এবং একটি ইন্টারফেস নয়।
যোগ লেখক Guillaume, উৎস
@ গুইলেমুয়েল বস্তু কার্যকারিতা আইলড তৈরি করেছে, তাই এটি সরাসরি ব্যবহার করা যাবে
যোগ লেখক archil, উৎস

ইন্টারফেস একটি ইন্টারফেস। এটি একটি টেমপ্লেট। কেন আপনি একটি ইন্টারফেস অন্তর্বর্তী করতে চান? ইন্টারফেসটি বাস্তবায়ন করুন এবং সেই ক্লাসটি তাত্পর্যপূর্ণ করুন। আপনি একটি ইন্টারফেস পরিচায়ক না করতে পারেন, এটি সত্যিই জ্ঞান না

0
যোগ
অবশ্যই এটি একটি ইন্টারফেস তাত্পর্যপূর্ণ একটি সহজ উপায় আছে অর্থে তোলে। DTOs কল্পনা করুন কোন আচরণ সঙ্গে POCOs আপনি একটি আনুষ্ঠানিক কাঠামোর মধ্যে তাদের সহজে ব্যবহার করার জন্য তাদের ইন্টারফেস হিসাবে তৈরি করতে চান, কিন্তু যখন আপনি ইন্টারফেসটি বাস্তবায়ন করেন, আপনি মূলত দুটি অভিন্ন টুকরো কোড দিয়ে শেষ করেন যা আপনাকে বজায় রাখতে হবে। তাই কিছু কাঠামো, যেমন NServiceBus, আপনাকে "ইন্টারফেসগুলি তাত্ক্ষণিক" করতে দেয় আমি বলছি না যে এটি অ্যাক্টিভেটর মত বৈশিষ্ট্যগুলি দিয়ে সহজেই করা যেতে পারে, আমি শুধু বলছি যে আপনি এটিকে বন্ধ করতে পারবেন না যেমনটি "অনুভূতি তৈরি করে না"
যোগ লেখক Morten, উৎস

আপনি যা চান তা 'আইআইসি'র কন্টেইনারের মত ব্যবহার করতে পারেন যেমন' নেন্জ '। আপনি একটি ইন্টারফেসের অনুরোধ করেছেন যখন আপনি একটি কংক্রিট টাইপ ফিরে একটি ধারক কনফিগার করতে পারেন।

0
যোগ

যদি লাইব্রেরিটি প্রজেক্টে উল্লেখিত হয় তবে আপনি এটি ব্যবহার করতে পারেন:

    static public IEnumerable GetTypesFromLibrary(String library)
    {
        var MyAsemblies = AppDomain.CurrentDomain.GetAssemblies()
                         .Where(a=>a.GetName().Name.Equals(library))
                         .Select(a=>a);
        var Exported = MyAsemblies
                         .FirstOrDefault()
                         .GetExportedTypes();
        var Asignable = Exported
                         .Where (t=> !t.IsInterface && !t.IsAbstract
                         && typeof(T).IsAssignableFrom(t))
                         .Select(t=>t)
                         .AsEnumerable();
        return Asignable;
    }

    static public T GetInstanceOf(String library, String FullClassName)
    {
        Type Type = GetTypesFromLibrary(library)
                        .Where(t => t.FullName.Equals(FullClassName))
                        .FirstOrDefault();
        if (Type != null)
        {
            T Instance = (T)Activator.CreateInstance(Type);
            return Instance;
        }
        return default(T);
    }
0
যোগ

গৃহীত উত্তর একমাত্র সমস্যা হল আপনার ইন্টারফেস প্রয়োগ করে আপনার সমাবেশে একটি কংক্রিটের ক্লাস থাকতে হবে।

এড়ানোর জন্য আমি আমার CustomActivator তৈরি করেছি যা রানটাইম এ একটি ডাইনামিক বস্তু তৈরি করতে সক্ষম এবং তা পছন্দসই ইন্টারফেস প্রয়োগ করে।

I put it on the github: https://github.com/fabriciorissetto/CustomActivator

কল সহজ:

CustomActivator.CreateInstance();
0
যোগ