tipos por objetos objeto lista dinámicos dinamicos dinamicamente crear controles codigo botones arreglos c# .net dynamic

c# - por - Crear dinámicamente un objeto de<Tipo>



objeto de objetos c# (6)

Aquí hay una función que escribí que clona un registro de tipo T, usando reflexión. Esta es una implementación muy simple, no manejé tipos complejos, etc.

public static T Clone<T>(T original) { T newObject = (T)Activator.CreateInstance(original.GetType()); foreach (var prop in original.GetType().GetProperties()) { prop.SetValue(newObject, prop.GetValue(original)); } return newObject; }

Espero que esto pueda ayudar a alguien.

Assaf

Tengo una tabla en mi base de datos que utilizo para administrar las relaciones en mi aplicación. es bastante básico en su naturaleza: parentType, parentId, childType, childId ... todo como enteros. He hecho esta configuración antes, pero lo hice con una configuración de interruptor / caja cuando tenía 6 tablas diferentes que estaba tratando de vincular. Ahora tengo 30 tablas con las que trato de hacer esto y me gustaría poder hacerlo sin tener que escribir 30 entradas de casos en mi comando de cambio.

¿Hay alguna forma de que pueda hacer referencia a una clase .Net usando una cadena? Sé que esto no es válido (porque he intentado varias variaciones de esto):

Type t = Type.GetType("WebCore.Models.Page"); object page = new t();

Sé cómo obtener el tipo de objeto, pero ¿cómo lo uso sobre la marcha para crear un nuevo objeto?


Desea usar Activator.CreateInstance .

Aquí hay un ejemplo de cómo funciona:

using System; using System.Runtime.Remoting; class Program { static void Main() { ObjectHandle o = Activator.CreateInstance("mscorlib.dll", "System.Int32"); Int32 i = (Int32)o.Unwrap(); } }



Si el llamador conoce el tipo, hay una manera mejor y más rápida que usar Activator.CreateInstance: en su lugar puede usar una restricción genérica en el método que especifica que tiene un constructor sin parámetros predeterminado.

Hacerlo de esta manera es seguro y no requiere reflexión.

T CreateType<T>() where T : new() { return new T(); }


Suponiendo que tiene el siguiente tipo:

public class Counter<T> { public T Value { get; set; } }

y hacer que el ensamblaje califique el nombre del tipo, puede construirlo de la siguiente manera:

string typeName = typeof(Counter<>).AssemblyQualifiedName; Type t = Type.GetType(typeName); Counter<int> counter = (Counter<int>)Activator.CreateInstance( t.MakeGenericType(typeof(int))); counter.Value++; Console.WriteLine(counter.Value);


public static T GetInstance<T>(params object[] args) { return (T)Activator.CreateInstance(typeof(T), args); }

Yo usaría Activator.CreateInstance () en lugar de lanzar, ya que el Activador tiene un constructor para genéricos.