为静态类的当前状态创建快照对象

贾维尔斯

我的系统中有一个静态类,用于跟踪测量频率,当前读取的样本数量,哪些传感器处于打开状态,哪些传感器处于关闭状态以及所有这些详细信息。

现在,我进行测量并想要在报告中创建报告,我想保存存储在静态类中的所有信息。像这样的东西:

public static class Details{
    public static int samplesRead { get; set;}
    public static int frequency { get; set;}
    public static List<devices> devices { get; set;}
}

public class Patient{...} // name, surname , blabla

public class ResultsSet {
    public DateTime date;
    public Patient patient;
    public *DetailsObject* details;
}

public void main {
   patient p = new patient(...);
   ... make the measurements ...

   var results = new ResultSet();
   results.patient = p;
   results.DateTime = DateTime.Now();
   results.details = **here the magic ** Details.ToObject();

   results.Serialize(myFilePath);
}

一个人如何完成对单个定义对象的转换?

Mong Zhu

它是为对象中的静态类制作快照的功能。[...]只是制造一个物体。

因此,您可以做的是创建一个与静态类具有相同属性的DTO:

public class DetailsSnapshot 
{
    public int samplesRead { get; set; }
    public int frequency { get; set; }
    public List<device> devices { get; set; }
}

您不能在任何给定时间映射并返回这样的对象:

public static class Details{
    public static int samplesRead { get; set;} 
    public static int frequency { get; set; }
    public static List<device> devices { get; set; } 

    public static DetailsSnapshot MakeSnapShot()
    {
        return new DetailsSnapshot
        {
            samplesRead = samplesRead,
            frequency = frequency,
            devices = devices.ToList()
        };
    }
}

然后,您可以在结果中包含这样的快照对象:

public class ResultsSet
{
    public DateTime date;
    public Patient patient;
    public DetailsSnapshot detailsSnapShot;
}

并按以下方式制作快照(此处为魔术):

results.detailsSnapShot = Details.MakeSnapShot();

编辑:

还有一种使用反射的方法。使用这种方法,您可以在Details类中扫描属性并提取值。您可以返回,Dictionary它基本上将属性名称映射到值:

public static Dictionary<string, object> MakeSnapShotReflection()
{
    PropertyInfo [] allPorperties = typeof(Details).GetProperties(BindingFlags.Public | BindingFlags.Static);

    Dictionary<string, object> valuemapping = new Dictionary<string, object>();

    for (int i = 0; i < allPorperties.Length; i++)
    {
        valuemapping.Add(allPorperties[i].Name, allPorperties[i].GetValue(null));
    }

    return valuemapping;
}

这种方式将使您可以Details使用其他属性扩展类,而不必担心扩展其他任何内容。

或简称:

public static Dictionary<string, object> MakeSnapShotReflection()
{
    PropertyInfo[] allPorperties = typeof(Details).GetProperties(BindingFlags.Public | BindingFlags.Static);
    return allPorperties.ToDictionary(key => key.Name, value => value.GetValue(null));
}

通过这种方法,您仍然可以使用intellisens访问正确的值:

测试数据:

public static class Details
{
    public static int samplesRead { get; set;} = 100;
    public static int frequency { get; set; } = 2700;
    public static List<device> devices { get; set; } = new List<device>() 
    { 
        new device { Name = "sensor1" }, 
        new device { Name = "sensor 2" } 
    };
}

public class device 
{
    public string Name { get; set; }
}

测试代码以访问值:

void Main()
{
    Dictionary<string, object> details = Details.MakeSnapShotReflection();

    Console.WriteLine(details[nameof(Details.frequency)]);
    Console.WriteLine(details[nameof(Details.samplesRead)]);

    foreach (var element in details[nameof(Details.devices)] as IEnumerable<device>)
    {
        Console.WriteLine(element.Name);
    }
}

输出:

2700
100
传感器1
传感器2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

泛型:syb与类的当前状态

JavaScript无法将修改后的对象的当前状态设置为for循环中的数组

我可以删除快照,但保留来自该快照的当前状态吗?

错误:未将对象引用设置为对象的实例。/未关闭连接。连接的当前状态为打开

Git:创建我的应用程序当前状态的快照

如何在DDD中为实体的当前状态建模

UPDATE操作-由于对象的当前状态,该操作无效

如何使console.log显示对象的当前状态?

ODOO:如何获取记录对象的当前状态?

SqlBulkCopy 抛出“由于对象的当前状态,操作无效”

错误:“由于对象的当前状态,操作无效”

REST API:由于对象的当前状态,操作无效

由于对象的当前状态,IEquatable操作无效

鉴于 ExecuteNonQuery() 中对象的当前状态,操作无效

在包含对象类的当前实例中调用Java方法

GWT的当前状态如何?

ngrx角度的当前状态

如何将对象的当前状态保存到Servlet的上下文路径或从Servlet的上下文路径获取对象的当前状态

在python中使用没有self的当前类(静态方法继承)

将静态方法定义为当前类的返回实例

使用静态方法构造扩展当前类的对象

快照对象状态的DRY方法

如何将本地 git 存储库更新为原始 github 存储库的当前状态?

英孚 连接未关闭。连接的当前状态为连接中

perforce重新分支(将dev分支重置为main分支的当前状态)

连接未关闭。连接的当前状态为打开。C#错误

Visual Studio和SQL错误连接未关闭。连接的当前状态为打开

System.InvalidOperationException:ExecuteReader需要打开且可用的连接。连接的当前状态为关闭

为什么会收到此错误{“由于对象的当前状态,操作无效。”} C#