我像这样创建person对象.
Person person=new Person("Sam","Lewis")
Run Code Online (Sandbox Code Playgroud)
它有这样的属性.
person.Dob
person.Address
Run Code Online (Sandbox Code Playgroud)
但现在我想添加这样的属性,并在创建对象后在运行时设置值.人.年老的人
如何在创建对象后添加这些额外的属性.那些属性名称可以不时更改.因此不能硬编码"年龄"和"性别".
Tho*_*que 52
使用"普通"对象是不可能的,但您可以使用ExpandoObject和dynamic关键字来完成:
dynamic person = new ExpandoObject();
person.FirstName = "Sam";
person.LastName = "Lewis";
person.Age = 42;
person.Foo = "Bar";
...
Run Code Online (Sandbox Code Playgroud)
如果尝试分配不存在的属性,则会将其添加到对象中.如果您尝试读取不存在的属性,则会引发异常.所以它与字典(和ExpandoObject实际实现IDictionary<string, object>)的行为大致相同
war*_*ckh 10
如果您只需要 JSON 序列化/反序列化的动态属性,例如,如果您的 API 根据上下文接受具有不同字段的 JSON 对象,那么您可以使用JsonExtensionDataNewtonsoft.Json 或 System.Text.Json 中可用的属性。
例子:
public class Pet
{
public string Name { get; set; }
public string Type { get; set; }
[JsonExtensionData]
public IDictionary<string, object> AdditionalData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后你可以反序列化 JSON:
public class Program
{
public static void Main()
{
var bingo = JsonConvert.DeserializeObject<Pet>("{\"Name\": \"Bingo\", \"Type\": \"Dog\", \"Legs\": 4 }");
Console.WriteLine(bingo.AdditionalData["Legs"]); // 4
var tweety = JsonConvert.DeserializeObject<Pet>("{\"Name\": \"Tweety Pie\", \"Type\": \"Bird\", \"CanFly\": true }");
Console.WriteLine(tweety.AdditionalData["CanFly"]); // True
tweety.AdditionalData["Color"] = "#ffff00";
Console.WriteLine(JsonConvert.SerializeObject(tweety)); // {"Name":"Tweety Pie","Type":"Bird","CanFly":true,"Color":"#ffff00"}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不能将动态类型与ExpandoObject一起使用,那么您可以使用"Property Bag"机制,其中,使用字典(或其他一些键/值集合类型)存储字符串key的名称属性和values所需的类型.
请参阅此处以获取示例实现.
看一下ExpandoObject.
例如:
dynamic person = new ExpandoObject();
person.Name = "Mr bar";
person.Sex = "No Thanks";
person.Age = 123;
Run Code Online (Sandbox Code Playgroud)
另外阅读这里.
| 归档时间: |
|
| 查看次数: |
87532 次 |
| 最近记录: |