He leído un par de bits y bobs en línea acerca de este tema pero no encontré ninguno que trabaje para mí.
Lo que estoy tratando de hacer es crear una clase de un Tipo en tiempo de ejecución.

Yo uso Activator.CreateInstance que funciona bien para las clases con los constructores que no contienen argumentos. Para aquellos con argumentos que se lanza una excepción, hay una forma de evitar esto?

Estoy más que feliz de pasar a valores nulos o vacíos de valores para el cto r de tanto tiempo como puedo crear de la misma clase.

InformationsquelleAutor Chris | 2009-08-17

5 Comentarios

  1. 47

    Hay una sobrecarga que acepta argumentos como params object[]:

    object obj = Activator.CreateInstance(typeof(StringBuilder), "abc");

    Tendría esto? Alternativa, puede utilizar la reflexión para encontrar la correcta constructor:

    Type[] argTypes = new Type[] {typeof(string)};
    object[] argValues = new object[] {"abc"};
    ConstructorInfo ctor = typeof(StringBuilder).GetConstructor(argTypes);
    object obj = ctor.Invoke(argValues);
    • Sólo por curiosidad, que sería mejor desde el punto de vista del rendimiento: obtener la lista de los constructores y la invocación de un determinado constructor a través de la reflexión o directamente llamando Activador.CreateInstance con objeto[]?
    • Espero que el ConstructorInfo enfoque. De lo contrario, se tiene que pensar acerca de qué valores son compatibles con las que los constructores – especialmente si usted ha pasado «null», etc (que podría coincidir con varios constructores).
    • Pero podrías tiempo ;-p en Realidad, si el rendimiento es una consideración importante, usted puede el caso de un pre-compilado Expresión LINQ (ya que este es .NET 3.5) que representa el constructor. Déjeme saber si usted quiere un ejemplo de esto.
    • Sólo he probado. CreateInstance es más lento. i.stack.imgur.com/kffhE.png
  2. 8

    Al final he acabado haciendo algo como esto – algunos de los comentaristas insinuó hacia esta solución, de todos modos.

    Yo, básicamente, a afirmar, por todos los constructores y optó por la más simple. Entonces creé datos nulos pasar en el cto r (por lo que estoy usando para este enfoque está muy bien)

    Parte del código que se parece un poco a este

    //If we have a ctor that requires parameters then pass null values
    if (requiresParameters)
    {
        List<object> parameters = new List<object>();
        ParameterInfo[] pInfos = constructorInfos[0].GetParameters();
    
        foreach (ParameterInfo pi in pInfos)
        {
            parameters.Add(createType(pi.ParameterType));
        }
    
        return constructorInfos[0].Invoke(parameters.ToArray());
    }
    • constructorInfos[0].GetParameters().Select(pi => createType(pi.ParameterType)).ToArray()
  3. 1

    Estoy usando este método para obtener alrededor de un problema que me encontré, y parece estar funcionando exactamente como yo esperaba. 🙂

    object instance = Activator.CreateInstance(
        typeof(OpCode),
        BindingFlags.NonPublic | BindingFlags.Instance,
        default(Binder),
        new object[] { stringname, pop, push, operand, type, size, s1, s2, ctrl, endsjmpblk, stack },
        default(CultureInfo));
    • Puede ser utilizado en cualquier tipo de…?
  4. 0

    Activador.CreateInstance también tiene un montón de sobrecargas, uno que usted puede ser que desee comprobar hacia fuera es ( Tipo, params object[] args ). Simplemente proveer la información requerida constructor de argumentos para el segundo parámetro de esta convocatoria.

    Asegúrese de que el manejo de excepciones aquí, sin embargo, como es fácil pasar parámetros incorrectos o para que algo cambie en el tipo de los constructores de la tarde en que la rompe..

  5. 0

    Como una alternativa al Activador.CreateInstance, FastObjectFactory en la dirección de url vinculado preformas mejor que el Activador (como de .NET 4.0 y significativamente mejor que el .NET 3.5. Ninguna de las pruebas/stats hecho con .NET 4.5). Ver StackOverflow post de estadísticas, información y código. Tenga en cuenta que algunas modificaciones puede necesitar ser hecho sobre la base del número de cto r de parámetros. El código proporcionado sólo permite 1 cto r param, pero puede ser modificado para tener más de 1. Ver comentarios en el código.

    Cómo pasar cto r args en el Activador.CreateInstance o el uso de la IL?

Dejar respuesta

Please enter your comment!
Please enter your name here