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

时间:2017-03-16 14:29:12

标签: c#

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

这是我所希望的:

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

我收到错误:

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

这不可能吗?

5 个答案:

答案 0 :(得分:5)

以下对我有用:
它允许您将任何对象转换为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;
}

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

但您可以使用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";

答案 3 :(得分:0)

由于我的对象具有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是编辑。 :)

答案 4 :(得分:0)

总结一下我的经验,如果您使用的是JSON.NET,则以下可能是解决方案之一:

var obj....//let obj any object
ExpandoObject expandoObject= JsonConvert.DeSerializeObject<ExpandoObject>(JsonConvert.SerializeObject(obj));

未经测试的表演等。但可以。