usuario personalizado formulario example dinamicamente crear controles control comunes agregar c# generics

personalizado - crear controles dinamicamente c# winforms



DinĂ¡micamente Crea un tipo genĂ©rico para la plantilla (3)

Aquí hay una pregunta: ¿ Realmente necesita crear un canal con el tipo de contrato exacto en su caso específico?

Ya que está haciendo enrutamiento, hay una gran posibilidad de que simplemente pueda tratar con las formas de canal genéricas. Por ejemplo, si enrutas un mensaje de solo ida, puedes crear un canal para enviar el mensaje de la siguiente manera:

ChannelFactory<IOutputChannel> factory = new ChannelFactory<IOutputChannel>(binding, endpoint); IOutputChannel channel = factory.CreateChannel(); ... channel.SendMessage(myRawMessage);

Si necesita enviar un servicio bidireccional, simplemente use IRequestChannel.

Si está haciendo enrutamiento, es, en general, mucho más fácil tratar con formas de canal genéricas (con un contrato genérico de servicio de catch-all al exterior) y simplemente asegurarse de que el mensaje que está enviando tenga todo el derecho encabezados y propiedades.

Estoy programando WCF usando ChannelFactory que espera un tipo para llamar al método CreateChannel. Por ejemplo:

IProxy proxy = ChannelFactory<IProxy>.CreateChannel(...);

En mi caso, estoy enrutando, así que no sé qué tipo usará mi fábrica de canales. Puedo analizar un encabezado de mensaje para determinar el tipo pero choco contra una pared de ladrillo porque incluso si tengo una instancia de Tipo I no puedo pasar eso donde ChannelFactory espera un tipo genérico.

Otra forma de replantear este problema en términos muy simples sería que estoy intentando hacer algo como esto:

string listtype = Console.ReadLine(); // say "System.Int32" Type t = Type.GetType( listtype); List<t> myIntegers = new List<>(); // does not compile, expects a "type" List<typeof(t)> myIntegers = new List<typeof(t)>(); // interesting - type must resolve at compile time?

¿Hay un enfoque para esto que pueda aprovechar dentro de C #?


Deberías mirar esta publicación de Ayende: WCF, Mocking y IoC: ¡Oh, MI! . En algún lugar cerca de la parte inferior es un método llamado GetCreationDelegate que debería ayudar. Básicamente hace esto:

string typeName = ...; Type proxyType = Type.GetType(typeName); Type type = typeof (ChannelFactory<>).MakeGenericType(proxyType); object target = Activator.CreateInstance(type); MethodInfo methodInfo = type.GetMethod("CreateChannel", new Type[] {}); return methodInfo.Invoke(target, new object[0]);


Lo que estás buscando es MakeGenericType

string elementTypeName = Console.ReadLine(); Type elementType = Type.GetType(elementTypeName); Type[] types = new Type[] { elementType }; Type listType = typeof(List<>); Type genericType = listType.MakeGenericType(types); IProxy proxy = (IProxy)Activator.CreateInstance(genericType);

Entonces, lo que está haciendo es obtener la definición de tipo de la clase genérica de "plantilla" y luego crear una especialización del tipo utilizando los tipos de conducción en tiempo de ejecución.