#dynamic #types #casting #blazor
Вопрос:
Я пытаюсь передать словарь в качестве параметра компоненту blazor. Словарь должен хранить <строка, динамическая>, <строка, динамическая><строка, список> и <строка, список><строка, Словарь<строка, динамическая><строка, динамическая>> пары ключ-значение.
Я попытался это сделать, но получил ошибку «»EventCallbackFactory» не имеет применимого метода с именем «CreateBinder», но, похоже, имеет метод расширения с этим именем. Методы расширения не могут быть динамически отправлены».
Является ли то, что я пытаюсь сделать, действительным, а если нет, то почему? Есть ли другой способ, которым я должен подойти к этому?
Вот код для моего компонента blazor, для справки:
@page "/dictitemcomponent"
@using System.Collections.Generic;
<ul>
@foreach (KeyValuePair<string, dynamic> item in thisDict)
{
@if(item.Value.GetType() == typeof(Dictionary<string, dynamic>))
{
<li>@item.Key.ToString() : </li>
@foreach (var dict in item.Value)
{
<DictItemComponent thisDict=dict/>
}
}
@if(item.Value.GetType() == typeof(List<dynamic>))
{
<li>@item.Key.ToString() : </li>
@foreach (var value in item.Value)
{
<li>@value</li>
}
}
@if(item.Value.GetType() != typeof(List<dynamic>) amp;amp; item.Value.GetType() != typeof(Dictionary<dynamic, dynamic>))
{
<li>@item.Key.ToString() : <input @bind="item.Value"/></li>
}
}
</ul>
@code
{
public KeyValuePair<string, dynamic> newProperty = new KeyValuePair<string, dynamic>();
[Parameter] public Dictionary<string,dynamic> thisDict {get; set;}= new Dictionary<string, dynamic>();
//convert the value of a KVP to a dictionary
public void ValueToProperty(KeyValuePair<string,dynamic> property)
{
string key = property.Key;
property = new KeyValuePair<string, dynamic>(key, new Dictionary<string, dynamic>());
}
public void ValueToList(KeyValuePair<string,dynamic> property)
{
string key = property.Key;
property = new KeyValuePair<string, dynamic>(key, new List<dynamic>());
}
}
Ответ №1:
Могу я узнать, чего вы пытаетесь достичь?
Основываясь на вашем первом утверждении if, зачем вам нужен словарь внутри словаря? Прочитав ваше исключение и ваше 3-е условное утверждение, кажется, что вы пытаетесь привязать входные данные к значению вашего словаря. Однако это не то, как вы должны использовать словарь. Если вы не привязаны к обычному свойству «тип» (например, строка), вы можете использовать @bind=someVariable
. В противном случае в словаре каждое значение должно привязываться к соответствующему ключу и, следовательно, @bind=_dict[key]
(синтаксис»сокращенного» для @bind-value
и @bind-value:event
) вместо привязки ввода к item.value
. Для более легкого понимания я описал вышеупомянутый условный оператор и смоделировал решение проблемы в следующих строках. Он должен отображать значение <label>
рядом с во input
время onchange
:
@page "/dict"
@foreach (var kvp in _dict)
{
<div>
<label>@kvp.Key</label>
<input @bind=_dict[kvp.Key] />
<label>Key:@kvp.Key|Value:@kvp.Value</label>
}
@code {
private Dictionary<string, string> _dict = new()
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three",
["4"] = "Four",
["5"] = "Five",
};
}
Meanwhile, you should simplify your if statements as follow:
@if(item.Value.GetType() == typeof(Dictionary<string, dynamic>))
{
//dowork
}
else if(item.Value.GetType() == typeof(List<dynamic>))
{
//do more work
}
else
{
//do other work
}
[Screenshot for my Input fields rendered based on Key Value Pair and value entered][1]
[1]: https://i.stack.imgur.com/iG6Mr.png