Компактная Платформа - как я динамично создаю тип без конструктора по умолчанию?

Тот же синтаксис используется для объявления функции - например, функция object, не принимая параметров и возвращая MyObject

6
задан Oli 24 September 2008 в 15:27
поделиться

3 ответа

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 });
9
ответ дан 10 December 2019 в 00:46
поделиться

Хорошо, вот броский вспомогательный метод дать Вам гибкий способ активировать тип, учитывая массив параметров:

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;

Таким образом, Вы передаете блок и название типа как первые два параметра и затем параметры всего конструктора в порядке.

1
ответ дан 10 December 2019 в 00:46
поделиться

Посмотрите, работает ли это на Вас (непротестированный):

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;

Если тип имеет больше чем одного конструктора затем, Вам, вероятно, придется сделать некоторые необычные активные действия для нахождения того, которое принимает строковый параметр.

Править: Просто протестированный код, и это работает.

Edit2: ответ Chris показывает необычные активные действия, о которых я говорил!;-)

0
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: