首页 > 解决方案 > 将属性和值添加到现有类 c#

问题描述

我需要根据用户配置在现有类中添加一个属性,我的意思是如果用户已在数据库中配置为添加一个新属性,例如属性名称为“名称”,数据类型为“字符串”,值为“米什拉'。实现这一点后,我将在 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": ""
    }]
}

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

标签: c#

解决方案


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

  1. 使用名为 example 的自定义属性Fields,并将其Dictionary添加到该字典中;或者干脆代替类使用字典。然后,当您想要获取类属性时,您只需要遍历该字典。
  2. 在运行时创建一个类并动态编译它;此选项更复杂,您可能更喜欢其他选项 - 但它已启用。有关如何动态编译类的更多信息,请参阅此问题。然后您可以获取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(公共语言运行时)处理,因此使用它们的代码效率较低。

推荐阅读