C# Blazor如何推断@typeparam指令的数据类型?

C# Blazor如何推断@typeparam指令的数据类型?,c#,blazor-webassembly,C#,Blazor Webassembly,下面的代码是使用.Net 5.0.203编写的 我有这个组件 霉素 @typeparam TItem <p>MyComponent: @typeName</p> @code { [Parameter] public IEnumerable<TItem> Data { get; set; } string typeName; protected override void OnInitialized() {

下面的代码是使用.Net 5.0.203编写的

我有这个组件

霉素

@typeparam TItem

<p>MyComponent: @typeName</p>

@code {
    [Parameter]
    public IEnumerable<TItem> Data { get; set; }

    string typeName;

    protected override void OnInitialized()
    {
        typeName = typeof(TItem).Name;
    }
}
@typeparam-TItem
MyComponent:@typeName

@代码{ [参数] 公共IEnumerable数据{get;set;} 字符串类型名; 受保护的覆盖无效OnInitialized() { typeName=typeof(TItem).Name; } }
这是调用组件的页面

剃刀索引

@page "/"

<MyComponent Data="@items"></MyComponent>

<p>Page: @itemsType</p>

@code
{
    string[] items = new string[2];

    string itemsType;

    protected override void OnInitialized()
    {
        itemsType = items.GetType().Name;
    }
}
@page/“
页面:@itemsType

@代码 { 字符串[]项=新字符串[2]; 字符串项类型; 受保护的覆盖无效OnInitialized() { itemsType=items.GetType().Name; } }
我希望MyComponent中的TItem类型是String[],但它是String


Blazor如何推断TItem的类型?

当您使用
typeparam-TItem
的通用约束时,当您创建组件时,您必须指定该类型

当您在此处调用组件时:

您将
@items
对象作为参数传递

如果您没有明确告诉组件它应该使用什么类型,那么默认情况下,它将使用传递给它的任何类型

你给了它一个
string[]
所以它说“他给了我一个
string[]
所以我假设
TItem
string
类型的。”。之所以这样做,是因为
string[]
可以隐式转换为
IEnumerable
,因为
TItem
可以是任何对象,除非您这样做,否则它只能是某些类型

另一件值得注意的事情是
TItem
IEnumerable
参数中包含的对象类型。如果要检查传递的
IEnumerable
类型,可以执行以下操作:

string[]s=新字符串[]{“fox”};
支票;
静态空隙检查(IEnumerable maybeArray)
{
Console.WriteLine(typeof(T));//System.String
Console.WriteLine(maybeArray是T[]);//true
Console.WriteLine(maybeArray是列表);//false
}

如果您想将代码> TTEM < /代码>作为<代码> String []/Cord>,请考虑接受<代码> TTEM < /代码>作为参数,而不是<代码> iNetraby< /C> > /< 例如:

[参数]
公共滴度数据{get;set;}
如果需要可枚举,请确保在
TItem
上包含一个约束

有关如何在blazor中包含泛型约束的更多信息(这很奇怪),请查看)