У меня есть класс, который имеет следующий конструктор
public DelayCompositeDesigner(DelayComposite CompositeObject)
{
InitializeComponent();
compositeObject = CompositeObject;
}
вместе со стандартным конструктором без параметров.
Далее я пытаюсь создать экземпляр, но он работает только без параметров:
var designer = Activator.CreateInstance(designerAttribute.Designer);
Это работает отлично, но если я хочу передать параметры, это не так:
var designer = Activator.CreateInstance(designerAttribute.Designer, new DelayComposite(4));
В результате получается MissingMethodException
:
Конструктор для типа Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesigner не найден
Какие-нибудь идеи здесь?
Проблема в том, что мне действительно нужно передать объект во время построения.
Вы видите, что у меня есть дизайнер, который загружает все типы, наследующие от CompositeBase
. Затем они добавляются в список, из которого пользователи могут перетащить их в конструктор. После этого к дизайнеру добавляется экземпляр перетаскивания. Каждый из этих классов имеет пользовательские свойства, определенные на них:
[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase
{
}
Когда пользователь выбирает элемент в конструкторе, он просматривает эти атрибуты, чтобы загрузить конструктор для этого типа. Например, в случае DelayComposite
он загрузит пользовательский элемент управления, который имеет метку и ползунок, которые позволяют пользователю установить свойство "Задержка" экземпляра DelayComposite
.
Пока это отлично работает, если я не передаю никакие параметры конструктору. Дизайнер создает экземпляр DelayCompositeDesigner
и присваивает его свойству содержимого WPF ContentPresenter
.
Но так как этому дизайнеру нужно изменить свойства выбранного DelayComposite
в дизайнере я должен передать этому экземпляру. Вот почему конструктор выглядит так:
public DelayCompositeDesigner(DelayComposite CompositeObject)
{
InitializeComponent();
compositeObject = CompositeObject;
}
Предложения приветствуются
@VolkerK
Результат вашего кода таков:
< ---- foo Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerVoid.ctor() Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerVoid.ctor(Vialis.LightLink.Controller.Scenarios.Composites.DelayComposite) пары: Vialis.LightLink.Controller.Scenarios.Composites.DelayComposite foo ---- >
Leppie, вы были правы, я почему-то ссылался на сборку Composites в своем приложении UI... что я не должен был делать, когда загружал его во время выполнения. Работает следующий код:
object composite = Activator.CreateInstance(item.CompositType,(byte)205);
var designer = Activator.CreateInstance(designerAttribute.Designer, composite);
Как вы можете видеть, код не знает тип DelayComposite
.
Это решает текущую проблему, но вводит много новых для того, чего я хочу достичь, в любом случае благодарим вас и благодарим всех, кто здесь ответил.
Что касается следующего кода, предложенного несколькими людьми:
var designer = Activator.CreateInstance(
designerAttribute.Designer,
new object[] { new DelayComposite(4) }
);
Activator.CreateInstance
имеет подпись, которая выглядит так:
Activator.CreateInstance(Type type, params object[] obj)
Поэтому он должен принять мой код, но я попробую предлагаемый код
UPDATE:
Я пробовал это, как было предложено:
var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4)});
Результат тот же.