将类转换为动态并添加属性

我有一个MyClass类。 我想将其转换为动态对象,以便我可以添加属性。

这是我所希望的:

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

我收到错误:

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

这不可能吗?

以下对我有用:
它允许您将任何对象转换为Expando对象。

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

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

您无法在运行时向类型添加属性。 但是,有一个例外: ExpandoObject 。 因此,如果您需要在运行时添加属性,则应使用ExpandoObject ,其他类型不支持此function。

您无法动态地向类实例添加成员。

但您可以使用ExpandoObject 。 使用factory创建新的并使用MyClass属性对其进行初始化:

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

然后你可以添加新成员:

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

由于我的对象具有JSON特定的命名,我想出了这个作为替代:

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

对我来说,结果非常好:

模型:

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

我以这种方式使用它:

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

结果收到了这个:

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

我不知道速度,我的意思是它是序列化和反序列化,但对于我的使用它一直很棒。 很多灵活性,比如用JsonIgnore隐藏属性。

注意:上面的xxxxx是编辑。 🙂