【问题标题】:add property and value to existing class c#将属性和值添加到现有类 c#
【发布时间】:2021-01-27 10:43:24
【问题描述】:

我需要根据用户配置在现有类中添加一个属性,我的意思是如果用户已在数据库中配置为添加一个新属性,例如属性名称为“名称”,数据类型为“字符串”并且值为“米什拉”。 完成后,我会在 Redis 缓存中保存一个 TestClass 数据列表。

  class TestClass
    {
        public long ID { get; set; }
    }

我已经尝试过链接https://msdn.microsoft.com/en-us/library/2sd82fz7.aspx 但我想添加一个现有的类,所以任何人都可以帮助我实现同样的目标。

我想根据我的 devex 网格的用户属性(列)配置呈现 JSON 数据。

数据喜欢-

{
"testClass": [
    {
      "scheduledTime": "2018-07-30T15:30:00",
      "estimatedTime": "2018-07-30T15:30:00",
      "flightNumber": "EY4512",
      "airLine": "assets/images/EY_88x45.jpg",
      "fromVia": "Chengdu,Dallas",
      "partner": "EY2356",
      "status": "Departed",
      "flightColor": null,
      "cityColor": null,
      "publicArrivalPlaceholder1": "CTU,DFW",
      "publicArrivalPlaceholder2": "12_IT",
      "publicArrivalPlaceholder3": "AIR",
      "publicArrivalPlaceholder4": "7/30/2018 3:30:00 PM",
      "publicArrivalPlaceholder5": "7/30/2018 3:30:00 PM",
      "id": "179490",
      "cellRule": "",
      "rowRule": ""
    },
    {
      "scheduledTime": "2018-07-30T17:00:00",
      "estimatedTime": "2018-07-30T14:00:00",
      "flightNumber": "EY1213",
      "airLine": "assets/images/EY_88x45.jpg",
      "fromVia": "Adelaide,Ahmedabad",
      "partner": "EY8562",
      "status": "Departed",
      "flightColor": null,
      "cityColor": null,
      "publicArrivalPlaceholder1": "ADE,AMD",
      "publicArrivalPlaceholder2": "2A_T4",
      "publicArrivalPlaceholder3": "AIR",
      "publicArrivalPlaceholder4": "7/30/2018 5:00:00 PM",
      "publicArrivalPlaceholder5": "7/30/2018 2:00:00 PM",
      "id": "179489",
      "cellRule": "",
      "rowRule": ""
    }]
}

这里的scheduledTime、estimatedTime、flightNumber 等是我需要在运行时解决的属性。

【问题讨论】:

  • 你想在运行时添加属性还是在编译时添加?
  • 你的主要目的是什么,你确定 Dictionary 不够用,或者可能是动态属性?
  • 是否有理由不使用具有名称/值对的数组?还是字典?或者甚至只是将属性默认设置为 null 并且仅将那部分数据添加到缓存中(如果它不为 null)?您也可以只是子类化并使用一个函数,该函数根据给定的值确定要创建哪种类型的对象。
  • 我想在运行时添加属性。我的主要目的是为我的 devex 网格呈现列表类型的 json 数据。我将从 xml 获取数据到用户的映射属性。

标签: c#


【解决方案1】:

基本上,您不能更改 C# 中的类定义。但是有一些解决方案:

  1. 使用名为Fields 的自定义属性,这将是Dictionary,并添加属性将其添加到该字典中;或者干脆代替类使用字典。然后,当您想要获取类属性时,您只需要遍历该字典即可。
  2. 在运行时创建类并动态编译;此选项更复杂,您可能更喜欢其他选项 - 但它已启用。有关如何动态编译类的更多信息,请参阅this question。然后你可以得到一个类的Type对象并迭代它的属性(有TypeBuilder.DefineProperty()的地方;它为在运行时创建的类定义了一个新属性)。
  3. 这个选项基本上和选项1一样,但是如果你使用的是C# 4+,你可以使用关键字dynamic,它可以像对象一样访问字典;例如,创建以下类:
dynamic dict = new System.Dynamic.ExpandoObject();
dict.Property = "Value";
dict.Num = 123;
Console.WriteLine(dict.Property);
Console.WriteLine(dict.NonExistProperty); // Will throw an exception

有关 C# 中动态对象的更多信息,请参阅Microsoft Docs

编辑:

请注意,动态对象由 DLR(动态语言运行时)而不是 CLR(公共语言运行时)处理,因此使用它们的代码效率较低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多