为啥 Blazor 的 ComponentBase 类的扩展方法只能通过这个获得?
Posted
技术标签:
【中文标题】为啥 Blazor 的 ComponentBase 类的扩展方法只能通过这个获得?【英文标题】:Why extension methods for Blazor's ComponentBase class are only available trough this?为什么 Blazor 的 ComponentBase 类的扩展方法只能通过这个获得? 【发布时间】:2022-01-15 04:59:09 【问题描述】:我需要使用几个方便的方法来扩展所有 Blazor 组件(不管为什么,只是一些特定于项目的东西)。
我不确定这是否是在 Blazor 中执行此操作的唯一方法,但我决定使用良好的旧扩展方法:
public static class ComponentBaseExtensions
public static string MyMethod(this ComponentBase component, ...)
...
一切都很好,除了一个烦人的问题:这些扩展方法只有在我通过this
调用它们时才可用,即该代码是有效的:
<div class="@this.MyMethod()"></div>
而这个不是:
<div class="@MyMethod()"></div>
所以,问题是:为什么它会这样以及如何摆脱它(如果可能的话)以使剃须刀模板更干净?
【问题讨论】:
【参考方案1】:我需要使用几个方便的方法来扩展所有 Blazor 组件
然后你可以使用继承。添加基类
class MyComponentBase : ComponentBase
protected string MyMethod(int x)
在所有相关页面之上:
@inherits MyComponentBase
... MyMethod(7);
【讨论】:
是的,我想过,但在这种情况下,我将失去从其他组件(例如第三方)继承我的组件并以与 MyComponentBase 相同的方式使用它们的可能性(这实际上是为什么我使用扩展方法)。【参考方案2】:现在明白了:它实际上是绝对正常的 C# 行为,看起来像 I just wanted
它在剃刀模板上下文中以特殊方式工作。
所以,这个问题有点愚蠢,但也许它会对和我一样困惑的人有所帮助:-)
【讨论】:
请编辑或删除您的问题...以上是关于为啥 Blazor 的 ComponentBase 类的扩展方法只能通过这个获得?的主要内容,如果未能解决你的问题,请参考以下文章
Blazor 服务端组件 Render, RenderFragment ,RenderTreeBuilder, CascadingValue/CascadingParameter
在 blazor 中使用自定义组件时在注入的差异服务中调用 HttpContextAccesor 后为 null