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

162
Vistas
Convert class to dynamic and add properties

I have a class MyClass. I would like to convert this to a dynamic object so I can add a property.

This is what I had hoped for:

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

I get the error:

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

Is that not possible?

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

0

The following has worked for me in the past:
It allows you to convert any object to an Expando object.

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;
}

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

about 4 years ago · Santiago Trujillo Denunciar

0

As my object has JSON specific naming, I came up with this as an alternative:

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

For me the results worked great:

Model:

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; }
}

I used it in this manner:

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

And received this as a result:

{
  "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"
}

I don't know about speed, I mean it is serializing and deserializing, but for my use it has been great. A lot of flexability like hiding properties with JsonIgnore.

Note: xxxxx above is redaction. :)

about 4 years ago · Santiago Trujillo Denunciar

0

You cannot add members to class instances on the fly.

But you can use ExpandoObject. Use factory to create new one and initialize it with properties which you have in MyClass:

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

Then you can add new members:

dynamic dto = Factory.Create(id);
dto.newProperty = "123";
about 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