【发布时间】:2020-03-17 07:38:55
【问题描述】:
我正在为 Blazor 组件构建一个可重用的 Razor 类库。
我有一个任何 Blazor 组件都可以实现的接口:
public interface IControllableComponent
{
void SetSomeValue(int someValue);
}
如何获得实现该接口的所有组件的列表?
public interface IControllableComponentManager
{
void SetSomeValueForAllControllableComponents(int someValue);
}
public class ControllableComponentManager : IControllableComponentManager
{
IList<IControllableComponent> _controllableComponentList;
public ControllableComponentManager()
{
_controllableComponentList = ??? // how to populate this list?
}
public void SetSomeValueForAllControllableComponents(int someValue)
{
foreach (var controllableComponent in _controllableComponentList)
{
controllableComponent.SetSomeValue(someValue);
}
}
}
我希望我的可重用 Razor 类库在不同项目的代码中使用:
public class MyControllableComponentBase : ComponentBase, IControllableComponent
{
protected int _someValue;
public void SetSomeValue(int someValue)
{
_someValue = someValue;
}
}
有没有办法在 ControllableComponentManager 中填充 _controllableComponentList?
我想以一种干净、适当的方式完成此操作,而不使用反射。最好采用带有依赖注入的 ASP.NET Core 风格。
问题是 Blazor 组件在 Razor 标记中被实例化为 <Component></Component>,所以我不知道如何获取它们的引用以将它们添加到 List<>。
【问题讨论】:
-
您可以使用反射和
Assembly.GetTypes()搜索类型。然后,您可以通过它们正在实现的接口过滤这些类型。请注意,这通常是一项昂贵的操作,因此您应该缓存结果。 -
@poke 那将是最后的手段。我真的更愿意以一种干净、适当的方式来做这件事,而不使用反射。
-
唯一的其他方法是主动创建所有这些组件类型的列表。但如果你想检测它们,那就是反射的用途。
-
@poke 不,我不想检测它们。我正在寻求一种创建列表的方法。但由于 Blazor 组件在 Razor 标记中实例化为
<Component></Component>我不知道如何获取它们的引用以将它们添加到列表中。
标签: c# asp.net-core razor blazor