[英]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.