如何在 Blazor (sub) 组件中引用“@typeparam TModel”字段?

How can I reference a "@typeparam TModel" field in the Blazor (sub)-component?

提问人:John D 提问时间:11/9/2021 更新时间:11/9/2021 访问量:300

问:

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

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

如下所示。请注意 TModel 类的 (a) “ddlOtherModel_Value” 和 (b) “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 的键字段名称都不同:UID_CUSTOMER、UID_VEHICLE、UID_DEPARTMENT...等。

在上面的代码片段中,针对此问题显示了“UID_MODEL”——它不是实际的键字段名称。

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

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

C# Blazor 客户端 WebAssembly

评论

0赞 Brian Parker 11/10/2021
@typeparam TItem @attribute [CascadingTypeParameter(nameof(TItem))]

答:

1赞 Frank 11/9/2021 #1

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

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

评论

0赞 John D 11/9/2021
谢谢你,@Frank...在每个模型中,我将有另一个名为“UID_KEY”的属性,可以从抽象的 TModel 中引用。对我来说很容易解决。如果我需要其他需要公开 TModel 的特定字段,我可以轻松地将它们添加到实际的 model-class.ds 中。谢谢
0赞 Frank 11/9/2021
@JohnD 我认为,鉴于您所说的和提出的要求,在非技术环境中考虑面向对象范式对您很有用。“宠物动物”可能有一个名字,但“宠物动物”的子类型可能是“猫”、“狗”等。将“狗名”类型引入与“猫名”不同的东西是没有用的,也不现实,这实际上是您所做的。在现实生活中,可能有一个与“猫名目录”不同的“狗名目录”,但它们都是名称目录类型的实例,而“名称”仍然是名称,而与类型上下文无关
0赞 Frank 11/9/2021
@JohnD 您的模型类型不是 TModel 的子类型吗?
0赞 John D 11/10/2021
谢谢弗兰克。TModel 是一个 Blazor @typeparam,其名称为“TModel”,在 PAGE 组件“使用和显示”的(子)组件中定义。父页面将模型(客户、车辆、部门等)作为参数“TModel=Customer”传递。子组件具有诸如“List<TModel> _OtherModelData {get/set};”之类的变量。Blazor 允许我可以对此列表进行排序/筛选/First(),它在代码中以这种方式工作。但是,看来我无法得到“......Where( r => r.UID_KEY == /somevalue/)“来工作。另外,我尝试添加“UID_KEY”作为 {get} 返回UID_CUSTOMER;请参阅下一条评论。
0赞 John D 11/10/2021
进一步基于您的第二篇文章,也许我需要创建一个新的基类(如 Animal/MyTModel),其中包含狗、猫和鱼,例如客户、车辆和部门。评论?谢谢约翰