У меня есть класс со следующим конструктором
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.Delay .LightLink.Controller.Scenarios.Composites.DelayComposite foo ---->
Леппи, вы были правы, я по какой-то причине ссылался на сборку Composites в моем приложении пользовательского интерфейса ... это не то, что я должен был делать, поскольку я загружал его во время выполнения. Следующий код работает:
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)
Так что он должен принять мой код, но я попробую предложенный код
ОБНОВЛЕНИЕ:
Я пробовал это, как было предложено:
var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4)});
Результат тот же.
public
(ой!) - person Cameron   schedule 25.08.2010