我有一个班级MyClass
。我想将其转换为动态对象,以便添加属性。
这是我所希望的:
dynamic dto = Factory.Create(id);
dto.newProperty = "123";
我收到错误:
WEB.Models.MyClass does not contain a definition for 'newProperty'
这不可能吗?
答案 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;
}
答案 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));
未经测试的表演等。但可以。