【问题标题】:How can I reference a "@typeparam TModel" field in the Blazor (sub)-component?如何在 Blazor(子)组件中引用“@typeparam TModel”字段?
【发布时间】:2021-11-09 01:18:19
【问题描述】:

VS-2019 Core 5 Blazor 客户端组件定义了一个 @typeparam TModel 来使用

private List<TModel> _allModelRecs { get; set; }

如下代码所示。注意 (a) "ddlOtherModel_Value" 和 (b) TModel 类的 "UID_MODEL" 字段...

// Select first 'Record'.
IDictionary<int, string> _ModelFiltersList = (Dictionary<int, string>)_ModelFiltersList.OrderBy(r => r.Value);
TModel _OtherModel = _allModelRecs.Where(r => r.**UID_MODEL** == _ModelFiltersList.First().Key);
int ddlOtherModel_Value = _OtherModel.**UID_MODEL**;

由于该组件可以而且必须与不同的“TModel(s)”(客户、车辆、部门...等)一起使用,我需要将“ddlOtherModel_Value”设置为 TModel 实例的“键”值/记录。每个 TModel(s) 的关键字段名称都不同:UID_CUSTOMER、UID_VEHICLE、UID_DEPARTMENT...等。

在上面的代码 sn-p 中显示了这个问题的“UID_MODEL”——它不是实际的关键字段名称。

问题来了…… 如何在“UID_MODEL”的实际 TModel 键名中为这些变体编码?

欢迎您的 cmets 或问题或答案。谢谢约翰

【问题讨论】:

  • @typeparam TItem @attribute [CascadingTypeParameter(nameof(TItem))]

标签: c# blazor client-side webassembly


【解决方案1】:

基本上你不应该。应在抽象 TModel 上定义 UID。

如果由于某种原因无法控制,那么您将需要实现一些扩展来获取 id。例如,您可以实现一个包装类或一组静态扩展方法。另一种选择是使用反射来获取以“UID”开头的字段,但这可能会很慢。

【讨论】:

  • 谢谢你,@Frank... 我将在每个模型中拥有另一个名为“UID_KEY”的属性,可以从抽象 TModel 中引用它。对我来说很容易解决。如果我需要其他需要接触 TModel 的特定字段,我可以轻松地将它们添加到实际的 model-class.ds 中。谢谢
  • @JohnD 我认为,鉴于您所说和所问的,在非技术环境中考虑面向对象范式对您很有用。一个“宠物动物”可能有一个名字,但“宠物动物”的子类型可能是“猫”、“狗”等。将“狗名称”类型引入为不同于'猫名',这实际上就是你所做的。在现实生活中,使用的“狗名目录”可能与“猫名目录”不同,但它们都是名称目录 typeinstances 而 '无论类型上下文如何,name' 仍然是名称
  • @JohnD 你的模型类型不是 TModel 的子类型吗?
  • 谢谢弗兰克。 TModel 是一个 Blazor @typeparam,名称“TModel”在 PAGE 组件“使用和显示”的(子)组件中定义。父页面将模型(客户、车辆、部门等)作为参数“TModel=Customer”传递。子组件具有“List _OtherModelData {get/set};”等变量。 Blazor 允许我可以排序/过滤/First() 这个列表,它在代码中以这种方式工作。但是,看来我无法让“...Where(r => r.UID_KEY == /somevalue/)”工作。另外,我尝试将“UID_KEY”添加为 {get} 返回 UID_CUSTOMER;见下一条评论。
  • 进一步根据您的第二篇文章,也许我需要创建一个新的基类(如 Animal/MyTModel),其中包含狗、猫和鱼,如 Customer、Vehicle 和 Department。注释?谢谢。约翰
猜你喜欢
  • 2021-05-17
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2022-12-22
相关资源
最近更新 更多