动态添加属性到现有对象

Snj*_*Snj 36 c#

我像这样创建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

使用"普通"对象是不可能的,但您可以使用ExpandoObjectdynamic关键字来完成:

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>)的行为大致相同

  • @Sanjeewa,在这种情况下,你最好的选择可能是使用`Dictionary <string,object>`.如果在运行时之前不知道属性名称,那么`ExpandoObject`将不会非常有用. (3认同)

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)

  • 这不是问题的答案,但却是非常有用的信息 (3认同)

Gra*_*mas 9

如果您不能将动态类型与ExpandoObject一起使用,那么您可以使用"Property Bag"机制,其中,使用字典(或其他一些键/值集合类型)存储字符串key的名称属性和values所需的类型.

请参阅此处以获取示例实现.


Geo*_*ett 8

看一下ExpandoObject.

例如:

dynamic person = new ExpandoObject();
person.Name = "Mr bar";
person.Sex = "No Thanks";
person.Age = 123;
Run Code Online (Sandbox Code Playgroud)

另外阅读这里.