向现有的类C#添加属性和值

时间:2018-07-30 09:59:04

标签: c#

我需要按照用户配置在现有类中添加属性,这意味着如果用户已在数据库中配置为添加新属性,例如属性Name为“ Name”,数据类型为“ string”,值是“ Mishra”。 完成此操作后,我将在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": ""
    }]
}

计划时间,估计时间,航班号等是我需要在运行时解析的属性。

1 个答案:

答案 0 :(得分:0)

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

  1. 使用名为Fields的自定义属性,该属性将是Dictionary,并添加属性,将其添加到该字典中;或者只是简单地使用字典来代替类。然后,当您想要获取类属性时,只需要遍历该字典即可。
  2. 在运行时创建一个类并动态编译它;此选项更为复杂,您可能希望使用其他选项-但已启用。有关如何动态编译类的更多信息,请参见this question。然后,您可以获取该类的Type对象并对其属性进行迭代(有TypeBuilder.DefineProperty()的位置;它为在运行时创建的类定义了一个新属性)。
  3. 该选项基本上与选项1类似,但是如果您使用的是C#4+,则可以使用关键字dynamic,该关键字可以像访问对象一样用于访问字典;例如,创建以下类:
public class DynamicDictionary : DynamicObject
{
    private readonly Dictionary<string, object> _Dict;

    public DynamicDictionary(Dictionary<string, object> dict)
    {
        _Dict = dict;
    }

    public DynamicDictionary()
    {
        _Dict = new Dictionary<string, object>();
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        _Dict[binder.Name] = value;
        return true;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (_Dict.TryGetValue(binder.Name, out result))
        {
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }
}

dynamic dict = new DynamicDictionary();
dict.Property = "Value";
dict.Num = 123;
Console.WriteLine(dict.Property);
Console.WriteLine(dict.NonExistProperty); // Will throw an exception

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

编辑:

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

编辑2:

您可以将类DynamicDictionary定义为通用类(public class DynamicDictionary<TValue> : DynamicObject,并使用字典Dictionary<string, TValue>),因此您将仅启用类型TValue的属性(或从中继承)。但是,如果这样做,则应在方法objectTValue中将值从TryGetMember()转换为TrySetMember()