对于背景,对于我的每个表单,它们绑定到两个对象之一:InsertParameters 或 UpdateParameters,具体取决于您是进行插入还是更新。插入和更新的表单是相同的,所以我希望它们能够处理这两者。我需要实现双向绑定。
我不想复制组件来更新和插入。
我希望能够做这样的事情,检查组件绑定要绑定的内容:
<InputDate @bind-Value=@(updateParams is not null ? updateParams.Date : insertParams.Date) />
目前,我可以通过以下方式实现这一目标:
<InputDate Value=@(updateParams is not null ? updateParams.Date : insertParams.Date)
ValueChanged=@((x) => HandleValueChanged(x, nameof(CaseActivity.Date)) />
处理值更改:
private void HandleValueChanged(object? value, string propertyName)
{
if (value == null) return;
if (updateParams != null)
{
PropertySetter.SetPropertyValue(updateParams, propertyName, value);
}
else
{
PropertySetter.SetPropertyValue(insertParams!, propertyName, value);
}
}
属性设置者:
public static void SetPropertyValue<T>(T obj, string propertyName, object? value)
{
if (obj == null)
{
throw new ArgumentNullException(nameof(obj));
}
if (propertyName == null)
{
throw new ArgumentNullException(nameof(propertyName));
}
Type objectType = typeof(T);
PropertyInfo? property = objectType.GetProperty(propertyName);
if (property == null)
{
throw new ArgumentException($"Property '{propertyName}' not found on type '{objectType.FullName}'.");
}
if (!property.CanWrite)
{
throw new ArgumentException($"Property '{propertyName}' on type '{objectType.FullName}' does not have a public setter.");
}
property.SetValue(obj, value);
}
虽然这有效,但我只是觉得必须有一种更好的方法来实现这一点,而且更内置,但我的搜索尚未取得任何成功。
非常感谢任何帮助。
当您可以控制参数 tpes 时:
interface IHaveDate { DateTime Date { get; set; } }
class InsertParams : IHaveDate { ... }
class UpdateParams : IHaveDate { ... }
然后像这样使用它
<InputDate @bind-Value="@(updateParams as IHaveDate ?? insertParams).Date" />