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();
}
}
Este enlace debería ayudar:
http://msdn.microsoft.com/en-us/library/system.activator.createinstance(VS.71).aspx
Activator.CreateInstance creará una instancia del tipo especificado.
podrías envolverlo en un método genérico como este:
public T GetInstance<T>(string type)
{
return (T)Activator.CreateInstance(Type.GetType(type));
}
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.