如何在 c# 和 Blazor 中循环访问“this”关键字

How to iterate over "this" keyword in c# and Blazor

提问人:freyfrey01 提问时间:8/31/2022 最后编辑:marc_sfreyfrey01 更新时间:9/1/2022 访问量:189

问:

我目前正在尝试使用“this”关键字动态获取给定页面的所有变量并将其转换为 JSON 格式。我可以看到“this”关键字包含我正在寻找的所有信息,但是当尝试使用它进行转换时,它会返回一个空字符串。JsonConvert.SerializeObject(this)

我已经走上了可能对“this”值执行 foreach 的路线,但收到一个错误,即页面的类不包含 .我正在寻找一种方法,可以通过将其类型转换为“this”来迭代“this”,或者正确实现定义以便能够遍历对象本身。我的最终目标是得到类似的东西GetEnumeratorIEnumerableGetEnumerator

string jsonData= "";

foreach (var item in this)
{
    jsonData += JsonConvert.SerializeObject(item);
}

或者更好的是字符串

jsonData = JsonConvert.SerializeObject(this);

一个更合适的例子可能是在文件“Pages/Index”中

@page "/home"
<h2>HELLO WORLD</h2>
@code{
int tester = 13;
NavigationManager navMan = new NavigationManager();
UserService user = new UserService();
}

从理论上讲,我可以做到

string jsonData = "";
jsonData += JsonConvert.SerializeObject(this.user);
jsonData += JsonConvert.SerializeObject(this.navMan);
...

这将正常工作,但鉴于某些页面包含数百个变量,这将非常耗时。

通过在调试器中运行服务器,我可以在“this”中看到它包含诸如

navMan | Microsoft.AspNetCore.Components.Server.Circuits.RemoteNavigationManager
user | Services.UserService
tester | 13

通过扩展像“用户”这样的值,我可以看到它包含名称、电子邮件等值。

通过这样做,我得到了保存到的名称、电子邮件等变量名称和值,但希望对“this”中的每个对象执行此操作,而不必将每个变量硬编码到函数中jsonData += JsonConvert.SerializeObject(this.user);jsonDataSerializeObject

C# Razor Blazor This

评论

2赞 David 8/31/2022
指的是什么对象?如果该对象不可迭代,为什么要尝试迭代它?这样做的目的是什么?您希望将该对象转换为什么生成的 JSON?this
0赞 freyfrey01 8/31/2022
@David,这是一个 .razor 类型的对象,因为它是自定义 Razor 组件类。在调试器中运行 Web 服务器时,我可以看到“this”在我的情况下包含 6 种不同的对象类型,我想将它们转换为 JSON。例如,“this”中的一个对象是我的 NavigationManager 服务。只需执行 JsonConvert.SerializeObject(NavigationManager);我得到了我正在寻找的相关 JSON 信息,例如 URI,但我想对“this”中包含的所有对象执行此过程
0赞 David 8/31/2022
如果所需的数据位于对象的属性中,则应该能够序列化该对象。但是,如果没有一个最小的可重复的例子,任何人能做的就是猜测那个对象。如果能够访问要序列化的值之一并成功序列化它,则应该能够对所需的所有值执行此操作。此操作需要多动态?您事先知道要序列化的值吗?如果没有,那么您可以使用反射来“迭代”对象的属性/字段/等。但这听起来有点矫枉过正。
0赞 freyfrey01 8/31/2022
@David查看编辑
0赞 Dimitris Maragkos 8/31/2022
如果你这样做会发生什么?JsonConvert.SerializeObject(this);

答:

4赞 Dimitris Maragkos 8/31/2022 #1

返回空 json 的原因是默认情况下,Newtonsoft.Json 仅序列化公共成员。因此,我通过添加启用所有成员的序列化。JsonConvert.SerializeObject(this);

@attribute [JsonObjectAttribute(MemberSerialization = MemberSerialization.Fields)]

然后我收到异常“检测到自引用循环...”所以为了解决这个问题,我添加了。

string jsonData = JsonConvert.SerializeObject(this, new JsonSerializerSettings
{
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});

之后,我收到异常“此平台不支持操作”。所以在这一点上,我停了下来,因为看起来尝试序列化整个剃须刀组件是一个坏主意。

因此,与其说所有这些废话,我建议简单地手动添加到您想要序列化并希望最好的成员中:[JsonProperty]

@page "/home"

<h2>HELLO WORLD</h2>

@code {
    [JsonProperty]
    int tester = 13;

    [JsonProperty]
    [Inject]
    NavigationManager navMan { get; set; }

    [JsonProperty]
    UserService user = new UserService();

    protected override void OnInitialized()
    {
        string jsonData = JsonConvert.SerializeObject(this);
    }
}

评论

0赞 freyfrey01 8/31/2022
如果 NavigationManager 和 UserService 是注入的,而不是在 razor 组件中声明的,该怎么办?
1赞 Dimitris Maragkos 8/31/2022
而不是使用 systax 注入,将其声明为内部属性并添加属性:@inject NavigationManager NavMan@code { }[Inject][JsonProperty] [Inject] NavigationManager NavMan { get; set; }