Я наконец нашел способ сделать это, вот мое решение: я создал вспомогательный класс:
public class PropHolder
{
[Parameter]
public PropertyInfo info { get; set; }
[Parameter]
public string type { get; set; }
public PropHolder(PropertyInfo nfo, string propType)
{
info = nfo;
type = propType;
}
}
, затем я создал словарь этого класса и некоторые функции проверки (это внутри Clogi c)
[Parameter]
public Dictionary<int, PropHolder> Props{ get; set; }
public void GetAllProps()
{
Props = new Dictionary<int, PropHolder>();
//nfo = SCustomer.GetType().GetProperties();
int Cid = 0;
foreach (PropertyInfo pif in SCustomer.GetType().GetProperties())
{
Props[Cid] = new PropHolder(pif, pif.PropertyType.Name);
Cid++;
}
}
public string CheckName(PropHolder propertyInfo)
{
if (propertyInfo.GetType() == typeof(PropHolder))
{
return propertyInfo.type;
}
else
{
return propertyInfo.GetType().Name.ToString();
}
}
public PropertyInfo getInfo(PropHolder propertyInfo)
{
if (propertyInfo.GetType() == typeof(PropHolder))
{
return propertyInfo.info;
}
else
{
return null;
}
}
и, наконец, я могу l oop над ключами моего словаря и правильно связать все значения (получил много помощи вычисляя это из ответа, данного: "Агуа из Марса") вот это обновление C .razor содержание:
@if (Props != null)
{
@foreach (int key in Props.Keys)
{
var pinfo = Props[key];
@if (CheckName(pinfo) == "String")
{
<input type="text" class="form-control" value=@(getInfo(pinfo).GetValue(SCustomer)) @onchange="@((ChangeEventArgs __e) => getInfo(pinfo).SetValue(SCustomer, __e.Value.ToString()))" />
}
}
}
это дает мне поле ввода для каждого реквизита, имеющего тип String, если дополнительные типы должны обрабатываться, теперь его можно легко добавить. Это, вероятно, не лучшее решение, но оно работает. Я обновлю ответ, если будут опубликованы какие-либо лучшие рабочие решения.