tengo una clase que tiene la siguiente constructorActivator.CreateInstance no puede encontrar el constructor (MissingMethodException)
public DelayCompositeDesigner(DelayComposite CompositeObject)
{
InitializeComponent();
compositeObject = CompositeObject;
}
junto con un constructor predeterminado sin parámetros.
siguiente estoy tratando de crear una instancia, pero sólo funciona sin parámetros:
var designer = Activator.CreateInstance(designerAttribute.Designer);
Esto funciona muy bien, pero si quiero pasar parámetros no es así:
var designer = Activator.CreateInstance(designerAttribute.Designer, new DelayComposite(4));
Esto resulta en un MissingMethodException
:
tipo Constructor voor Vialis.LightLink.Controll er.Scenarios.Composites.DelayCompositeDesigner no se encontró
¿Alguna idea aquí?
El problema es que realmente necesito pasar un objeto durante la construcción.
Usted ve que tengo un diseñador que carga todos los tipos que heredan del CompositeBase
. Estos se agregan a una lista desde la cual los usuarios pueden arrastrarlos a un diseñador. Al hacerlo, se agrega una instancia del arrastre al diseñador. Cada una de estas clases tienen propiedades personalizadas definidas en ellos:
[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase
{
}
Cuando el usuario selecciona un elemento en el diseñador, que mira a estos atributos con el fin de cargar hasta un diseñador para ese tipo. Por ejemplo, en el caso del DelayComposite
cargaría un control de usuario que tiene una etiqueta y un control deslizante que permiten al usuario establecer la propiedad "Retraso" de la instancia DelayComposite
.
Hasta ahora, esto funciona bien si no paso ningún parámetro al constructor. El diseñador crea una instancia del DelayCompositeDesigner
y la asigna a la propiedad de contenido de un WPF ContentPresenter
.
Pero como ese diseñador necesita modificar las propiedades del DelayComposite
seleccionado en el diseñador, tengo que pasarle esta instancia. Es por ello que el constructor parece estar presente:
public DelayCompositeDesigner(DelayComposite CompositeObject)
{
InitializeComponent();
compositeObject = CompositeObject;
}
sugerencias son bienvenidas
@VolkerK
El resultado de su código es la siguiente:
< --- - foo Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerVoid .ctor() Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerVoid .ctor (Vialis.LightLink.Controller.Scenarios.Composites.DelayComposite) param: Vialis.LightLink.Controller.Scenarios.Composites.DelayComposite foo ---->
leppie, usted tenía razón, había por alguna razón hace referencia el conjunto de composites en mi aplicación de interfaz de usuario ... que no es algo que debería tener hecho mientras lo cargaba en tiempo de ejecución. El siguiente código funciona:
object composite = Activator.CreateInstance(item.CompositType,(byte)205);
var designer = Activator.CreateInstance(designerAttribute.Designer, composite);
Como se puede ver el código no tiene conocimiento del tipo DelayComposite
.
Esto resuelve el problema actual, pero introduce muchos nuevos para lo que quiero lograr, de cualquier manera, gracias y gracias a todos los que han respondido aquí.
En cuanto al siguiente código, sugerido por varias personas:
var designer = Activator.CreateInstance(
designerAttribute.Designer,
new object[] { new DelayComposite(4) }
);
El Activator.CreateInstance
tiene una firma que tiene este aspecto:
Activator.CreateInstance(Type type, params object[] obj)
por lo que debe aceptar mi código, pero Voy a intentar el código sugerido
ACTUALIZACIÓN:
He intentado esto como se sugiere:
var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4)});
El resultado es el mismo.
Timoteo - He modificado mi respuesta para pasar typeof (DelayCompositeDesigner) ... o tal vez todavía me falta una pieza del rompecabezas. – Kev
¿Puede ampliar cómo se declara designerAttribute.Designer? – Kev
Timothy - ¿es designerAttribute.Designer declarado como Type? – Kev