Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

169
Vistas
Convierta la clase en dinámica y agregue propiedades

Tengo una clase MyClass . Me gustaría convertir esto en un objeto dinámico para poder agregar una propiedad.

Esto es lo que esperaba:

 dynamic dto = Factory.Create(id); dto.newProperty = "123";

me sale el error:

 WEB.Models.MyClass does not contain a definition for 'newProperty'

¿No es eso posible?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Lo siguiente me ha funcionado en el pasado:
Le permite convertir cualquier objeto en un objeto Expando.

 public static dynamic ToDynamic<T>(this T obj) { IDictionary<string, object> expando = new ExpandoObject(); foreach (var propertyInfo in typeof(T).GetProperties()) { var currentValue = propertyInfo.GetValue(obj); expando.Add(propertyInfo.Name, currentValue); } return expando as ExpandoObject; }

Basado en: http://geekswithblogs.net/Nettuce/archive/2012/06/02/convert-dynamic-to-type-and-convert-type-to-dynamic.aspx

over 4 years ago · Santiago Trujillo Denunciar

0

Como mi objeto tiene un nombre específico de JSON, se me ocurrió esto como una alternativa:

 public static dynamic ToDynamic(this object obj) { var json = JsonConvert.SerializeObject(obj); return JsonConvert.DeserializeObject(json, typeof(ExpandoObject)); }

Para mí, los resultados funcionaron muy bien:

Modelo:

 public partial class Settings { [JsonProperty("id")] public int Id { get; set; } [JsonProperty("runTime")] public TimeSpan RunTime { get; set; } [JsonProperty("retryInterval")] public TimeSpan RetryInterval { get; set; } [JsonProperty("retryCutoffTime")] public TimeSpan RetryCutoffTime { get; set; } [JsonProperty("cjisUrl")] public string CjisUrl { get; set; } [JsonProperty("cjisUserName")] public string CjisUserName { get; set; } [JsonIgnore] public string CjisPassword { get; set; } [JsonProperty("importDirectory")] public string ImportDirectory { get; set; } [JsonProperty("exportDirectory")] public string ExportDirectory { get; set; } [JsonProperty("exportFilename")] public string ExportFilename { get; set; } [JsonProperty("jMShareDirectory")] public string JMShareDirectory { get; set; } [JsonIgnore] public string Database { get; set; } }

Lo usé de esta manera:

 private static dynamic DynamicSettings(Settings settings) { var settingsDyn = settings.ToDynamic(); if (settingsDyn == null) return settings; settingsDyn.guid = Guid.NewGuid(); return settingsDyn; }

Y recibió esto como resultado:

 { "id": 1, "runTime": "07:00:00", "retryInterval": "00:05:00", "retryCutoffTime": "09:00:00", "cjisUrl": "xxxxxx", "cjisUserName": "xxxxx", "importDirectory": "import", "exportDirectory": "output", "exportFilename": "xxxx.xml", "jMShareDirectory": "xxxxxxxx", "guid": "210d936e-4b93-43dc-9866-4bbad4abd7e7" }

No sé de velocidad, osea que es serializar y deserializar, pero para mi uso ha sido genial. Mucha flexibilidad como ocultar propiedades con JsonIgnore.

Nota: xxxxx arriba es redacción. :)

over 4 years ago · Santiago Trujillo Denunciar

0

No puede agregar miembros a instancias de clase sobre la marcha.

Pero puedes usar ExpandoObject . Use la fábrica para crear uno nuevo e inicialícelo con las propiedades que tiene en MyClass :

 public static ExpandoObject Create(int id) { dynamic obj = new ExpandoObject(); obj.Id = id; obj.CreatedAt = DateTime.Now; // etc return obj; }

Luego puedes agregar nuevos miembros:

 dynamic dto = Factory.Create(id); dto.newProperty = "123";
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda