繁体   English   中英

如何在运行时在 c# 中向 class 添加属性 - 来自 JSON 文件

[英]How to add properties to a class at runtime in c# - From JSON file

我想创建一个可以在运行时动态分配属性的 class。

我在做什么的简要总结:我正在创建一个程序,它将动态解析 XML 文件以用于不同的软件,并使用 MVC 在组织良好的表格中显示信息。 每个软件应用程序都在我的 JSON 文件中定义,并具有某些属性。

JSON 文件示例:

    "AMZsoftware": {
     "APP1": {
     "ResponseTime": "2412",
     "Location": [ "tmd_7609", "tmd_61573" ],
     "Properties": ["Speed", "Capacity", "Security"]
      },
      "APP2": {
      "ResponseTime": "1712",
      "Location": [ "LT_13", "LT_00" ],
      "Properties": ["Speed", "Resilience", "Security"]   
      },
     "APP3": {
      "ResponseTime": "0117",
      "Location": [ "AP_99", "AP_47" ],
      "Properties": ["Database", "WorkFlow", "LZSettings"]   
      },
     };

这只是我的 JSON 文件的一小部分,但主要是如果您查看属性部分,则有一个属性列表。 这些是需要在运行时分配的属性。 我有不同的类,这些类将为我处理检索和存储数据。

正如你所看到的,有些属性是重复的,但有些是不同的,我需要能够解释这些差异。 我将 JSON 文件中的属性存储在字符串列表中。

我已阅读有关使用字典的文章,但有没有办法可以创建具有动态属性的全新 class?

当用户选择查看有关 APP1 的数据时,我想创建一个 class 列出的属性,然后我的程序将正常处理解析和事情。

一旦信息存储在此动态 class 中,我会将其传递给视图并打印数据。 在此先感谢您的任何建议。

由此:“我有不同的类,这些类将为我处理检索和存储数据。”

如果我没看错,听起来您已经有了对属性进行操作的类。 您可以创建一个所有这些类都基于的接口,然后使用 Class 工厂返回 class 通过将属性名称传递给工厂来对给定的“属性”进行操作。

首先,执行 web 搜索“C# Class 工厂”,将会有大量关于 Class 工厂模式如何工作的信息。

本质上,Class 工厂具有一个接口、一个或多个实现该接口的类,以及一个返回实现该接口的 class 实例的工厂。 然后,应用程序可以使用所有这些部分来执行某些任务。

这是我拼凑起来的一个小例子。

数学运算.cs

// The interface that all factory classes must implement:
interface IMathOperation
{
    string getName();
    string performOperation(int a, int b);
}

实现接口的类:

添加.cs

public class Add : IMathOperation
{
    public string getName()
    {
        return "Addition";
    }

    public string performOperation(int a, int b)
    {
        return string.Format("{0} + {1} = {2}", a, b, a+b);
    }

}

减法.cs

public class Subtract : IMathOperation
{
    public string getName()
    {
        return "Subtraction";
    }

    public string performOperation(int a, int b)
    {
        return string.Format("{0} - {1} = {2}", a, b, a-b);
    }

}

乘法.cs

public class Multiply : IMathOperation
{
    public string getName()
    {
        return "Multiplication";
    }

    public string performOperation(int a, int b)
    {
        return string.Format("{0} * {1} = {2}", a, b, a*b);
    }

}

除法.cs

public class Divide : IMathOperation
{
    public string getName()
    {
        return "Division";
    }

    public string performOperation(int a, int b)
    {
        return string.Format("{0} / {1} = {2}", a, b, b != 0? ((float)((float)a / (float)b)).ToString() : "Divide by zero error");
    }

}

数学工厂.cs

class MathFactory
{

    public static IMathOperation getFactory(string mathOp)
    {
        switch (mathOp.ToUpper())
        {
            case "ADD":
            return new Add();

            case "SUB":
            return new Subtract();

            case "MUL":
            return new Multiply();

            case "DIV":
            return new Divide();
        }

        return null;
    }
}

程序.cs

using System;

namespace ClassFactory_C_Sharp {
    class Program
    {
        static void Main(string[] args)
        {
            IMathOperation op;

            Console.WriteLine("Hello Math Factory!\n");

            // try all the class factories

            op = MathFactory.getFactory("Add");
            Console.WriteLine(string.Format("{0}: {1}", op.getName(), op.performOperation(2,3)));

            op = MathFactory.getFactory("Sub");
            Console.WriteLine(string.Format("{0}: {1}", op.getName(), op.performOperation(2,3)));

            op = MathFactory.getFactory("Mul");
            Console.WriteLine(string.Format("{0}: {1}", op.getName(), op.performOperation(2,3)));

            op = MathFactory.getFactory("Div");
            Console.WriteLine(string.Format("{0}: {1}", op.getName(), op.performOperation(2,3)));

            // try one more divide that causes error
            Console.WriteLine(string.Format("{0}: {1}", op.getName(), op.performOperation(2,0)));
        }
    } }

output:

Hello Math Factory!

Addition: 2 + 3 = 5
Subtraction: 2 - 3 = -1
Multiplication: 2 * 3 = 6
Division: 2 / 3 = 0.6666667
Division: 2 / 0 = Divide by zero error

ExpandoObject对您来说可能是一个不错的选择。 它可以如下使用。

dynamic app2    = new ExpandoObject();
app2.Speed      = 2.54d;
app2.Resilience = 99;
app2.Security   = "High";

您可以将任意类型的任意数量的属性添加到您创建的 object 中。

我有一篇博客文章,其中包含有关ExpandoObject的更多信息,其中我还讨论了一种使用反射的替代方法,并且我有一个关于 GitHub 的示例项目,它从 JSON 文件中读取动态属性定义和值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM