我正试图找到一种方法来渲染我一无所知的组件。让我用下面的例子来解释。我有一个带有几个实现的c#接口:
public interface IClassA
{
//Some properties
}
public class ClassB : IClassA
{
//Some implementation
}
public class ClassC : IClassA
{
//Some implementation
}
页面类似于以下
@page "/"
@foreach (var item in list)
{
//How to display the item
}
@code {
private List<IClassA> list = new List<IClassA>();
protected override void OnInitialized()
{
//Load data
}
}
我很难找到如何在不知道项类的情况下呈现项。这样做的原因是我想允许其他人实现接口和相应的剃刀视图我的页面就可以使用它了。Blazor有可能吗?
如果相关的话,我正在将.Net 5与最新的Visual Studio版本一起使用。
编辑:这个解释似乎还不够。让我补充更多信息。
我正在尝试制作一个Blazor模块,一个基于节点的编辑器。因此,我可以实现一些基本类,但我希望能够拥有自定义和复杂的对象。我想要的是制作一些将由NodeTree管理的接口(INode、IInput、IOutput…(。然后,将有一个NodeTree组件,它将通过事件管理所有用户交互。由于我只提供接口,因此使用该模块的应用程序将提供实现,因此,它还将提供视图(剃刀组件(,其中包含将用于每个单独实现的标记。
例如,如果他们为字符串生成IInput实现,他们还将为组件提供类似的标记
<label>@input.Title</label>
<input type="text" @bind-value="@input.Value" />
当然,这是一个简化的示例,但它适用于自定义和复杂的对象,而不是基本类型。
我希望这能让我对我的问题有更多的了解。
你到底在问什么?
如果你想实现接口的成员,那没关系,继续吧。如果你想添加基于实现的逻辑,你也可以使用"是";关键词:
@if (item is ClassA){
<ComponentForClassA ItemToRender=item />
}
else if (item is ClassB) {
<ComponentForClassB ItemToRender=item />
}
else {
<GenericIClassAComponent ItemToRender=item />
}
因此,每个组件都将具有标记,用于显示该实现中的任何内容。但是,如果你想渲染一个你实际上没有任何信息的对象,比如它的成员是什么,那么首先要弄清楚一只手的拍手声D
好的,我继续在网上搜索,发现了一些至少能回答我问题的东西:不。我想做的事情目前还不可能,至少不能直接做。
以下是解释解决方法的网站:Blazor Dynamic Components
该网站还有一个链接,指向一个与我讨论的问题相同的问题,而微软自己似乎并不打算让这成为可能,下面是该问题的链接:添加DynamicComponent组件。乍一看,他们似乎回答了这个请求,但似乎不明白被问到了什么。
无论如何,当前版本的Blazor不允许我直接做什么。