una multiplicacion mostrar matriz matrices hacer enteros como cargar arreglos 3x3 2x2 c# reflection compact-framework .net-2.0

multiplicacion - mostrar matrices en c#



¿Cómo puedo crear una instancia de un tipo de matriz arbitraria en tiempo de ejecución? (4)

Estoy tratando de deserializar una matriz de un tipo desconocido en tiempo de compilación. En tiempo de ejecución, descubrí el tipo, pero no sé cómo crear una instancia.

Algo como:

Object o = Activator.CreateInstance(type);

que no funciona porque no hay un constructor sin parámetros, Array no parece tener ningún constructor.


Es una publicación bastante antigua, pero al responder una pregunta nueva, publicó un ejemplo relacionado de cómo crear una matriz multidimensional.

Asumiendo el tipo ( elementType ) como int y una matriz bidimensional por ejemplo.

var size = new[] { 2, 3 }; var arr = Array.CreateInstance(typeof(int), size);

Cuando es bidimensional, por ejemplo, se puede poblar como

var value = 1; for (int i = 0; i < size[0]; i++) for (int j = 0; j < size[1]; j++) arr.SetValue(value++, new[] { i, j }); //arr = [ [ 1, 2, 3 ], [ 4, 5, 6 ] ]


Puede usar una de las sobrecargas CreateInstance de Array, por ejemplo:

object o = Array.CreateInstance(type, 10);


Una alternativa es usar árboles de expresión para el rendimiento. Por ejemplo, si tiene tipo de matriz, type que podría hacer

var ctor = type.GetConstructors().First(); // or find suitable constructor var argsExpr = ctor.GetParameters().Select(x => Expression.Constant(0)); var func = Expression.Lambda<Func<object>>(Expression.New(ctor, argsExpr)).Compile();

Esto simplemente devuelve una matriz vacía. Probablemente no sea muy útil. MSDN declara que GetConstructors no garantiza ningún orden, por lo que puede necesitar una lógica para encontrar el constructor adecuado con los parámetros correctos para crear instancias con el tamaño correcto. Por ejemplo, podrías hacer:

static Func<object> ArrayCreateInstance(Type type, params int[] bounds) // can be generic too { var ctor = type .GetConstructors() .OrderBy(x => x.GetParameters().Length) // find constructor with least parameters .First(); var argsExpr = bounds.Select(x => Expression.Constant(x)); // set size return Expression.Lambda<Func<object>>(Expression.New(ctor, argsExpr)).Compile(); }

Lo mismo se puede lograr mucho más fácilmente con Expression.NewArrayBounds lugar de Expression.New , más funciona si todo lo que tienes es tipo de elemento de matriz, no el tipo de matriz. Manifestación:

static Func<object> ArrayCreateInstance(Type type, params int[] bounds) // can be generic too { var argsExpr = bounds.Select(x => Expression.Constant(x)); // set size var newExpr = Expression.NewArrayBounds(type.GetElementType(), argsExpr); return Expression.Lambda<Func<object>>(newExpr).Compile(); } // this exercise is pointless if you dont save the compiled delegate, but for demo purpose: x = string[] {... y = ArrayCreateInstance(x.GetType(), 10)(); // you get 1-d array with size 10 x = string[,,] {... y = ArrayCreateInstance(x.GetType(), 10, 2, 3)(); // you get 3-d array like string[10, 2, 3] x = string[][] {... y = ArrayCreateInstance(x.GetType(), 10)(); // you get jagged array like string[10][]

Simplemente cambie type.GetElementType() simplemente type si lo que está pasando es un tipo de elemento en sí mismo.