Compact Framework - كيف يمكنني إنشاء النوع ديناميكيًا بدون مُنشئ افتراضي؟

StackOverflow https://stackoverflow.com/questions/29436

سؤال

أنا أستخدم .NET CF 3.5.النوع الذي أرغب في إنشائه لا يحتوي على مُنشئ افتراضي، لذا أريد تمرير سلسلة إلى مُنشئ مثقل.كيف أقوم بهذا العمل؟

شفرة:

Assembly a = Assembly.LoadFrom("my.dll");
Type t = a.GetType("type info here");
// All ok so far, assembly loads and I can get my type

string s = "Pass me to the constructor of Type t";
MyObj o = Activator.CreateInstance(t); // throws MissMethodException
هل كانت مفيدة؟

المحلول

MyObj o = null;
Assembly a = Assembly.LoadFrom("my.dll");
Type t = a.GetType("type info here");

ConstructorInfo ctor = t.GetConstructor(new Type[] { typeof(string) });
if(ctor != null)
   o = ctor.Invoke(new object[] { s });

نصائح أخرى

@ جوناثان لأن الإطار المضغوط يجب أن يكون نحيفًا قدر الإمكان.إذا كانت هناك طريقة أخرى لفعل شيء ما (مثل الكود الذي نشرته)، فهي عمومًا لا تكرر الوظيفة.

وصف روري بليث ذات مرة إطار العمل المضغوط بأنه "مغلف حول System.NotImplementedExcetion".:)

حسنًا، إليك طريقة مساعدة غير تقليدية لتمنحك طريقة مرنة لتنشيط نوع محدد لمجموعة من المعلمات:

static object GetInstanceFromParameters(Assembly a, string typeName, params object[] pars) 
{
    var t = a.GetType(typeName);

    var c = t.GetConstructor(pars.Select(p => p.GetType()).ToArray());
    if (c == null) return null;

    return c.Invoke(pars);
}

وأنت تسميها هكذا:

Foo f = GetInstanceFromParameters(a, "SmartDeviceProject1.Foo", "hello", 17) as Foo;

لذلك تقوم بتمرير التجميع واسم النوع كأول معلمتين، ثم يتم ترتيب جميع معلمات المنشئ.

معرفة ما إذا كان هذا يناسبك (لم يتم اختباره):

Type t = a.GetType("type info here");
var ctors = t.GetConstructors();
string s = "Pass me to the ctor of t";
MyObj o = ctors[0].Invoke(new[] { s }) as MyObj;

إذا كان النوع يحتوي على أكثر من مُنشئ واحد، فقد يتعين عليك القيام ببعض الخطوات الرائعة للعثور على النوع الذي يقبل معلمة السلسلة الخاصة بك.

يحرر:لقد قمت للتو باختبار الكود وهو يعمل.

تحرير 2: إجابة كريس يُظهر الحركة الرائعة التي كنت أتحدث عنها!؛-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top