提问人:freyfrey01 提问时间:8/31/2022 最后编辑:marc_sfreyfrey01 更新时间:9/1/2022 访问量:189
如何在 c# 和 Blazor 中循环访问“this”关键字
How to iterate over "this" keyword in c# and Blazor
问:
我目前正在尝试使用“this”关键字动态获取给定页面的所有变量并将其转换为 JSON 格式。我可以看到“this”关键字包含我正在寻找的所有信息,但是当尝试使用它进行转换时,它会返回一个空字符串。JsonConvert.SerializeObject(this)
我已经走上了可能对“this”值执行 foreach 的路线,但收到一个错误,即页面的类不包含 .我正在寻找一种方法,可以通过将其类型转换为“this”来迭代“this”,或者正确实现定义以便能够遍历对象本身。我的最终目标是得到类似的东西GetEnumerator
IEnumerable
GetEnumerator
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);
jsonData
SerializeObject
答:
返回空 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);
}
}
评论
@inject NavigationManager NavMan
@code { }
[Inject]
[JsonProperty] [Inject] NavigationManager NavMan { get; set; }
上一个:不知道为什么用“this”来检查
下一个:一般获取当前类的名称?
评论
this
JsonConvert.SerializeObject(this);