为啥 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

为啥 Blazor 生命周期方法会执行两次?

Blazor + Identity:为啥会出现错误?

为啥 Blazor 使用 post 而不是 WebSockets?

Blazor 脚手架注册页面为啥 .cshtml 不是 .razor 文件?