0

我有这个视图模型:

    public class BankAccountViewModel : IValidator<BankAccountViewModel>
    {
      public BankAccount BankAccount { get; set; }

public void ConfigureValidation(ValidationConfiguration<StockOnHandViewModel> config)
        {
            config.For(m => m.BankAccount.AccountHolder);

        }
    }

所以课程是:

public class BankAccount
{
  public string AccountHolder { get; set; }
  public List<Transfer> Transfers { get; set; }
}

public class Transfer
{
  public int Amount { get; set; }
}

然后我有一些验证扩展

public static class ValidationExtensions
    {
  public static PropertyRuleSet<TModel, TProperty> For<TModel, TProperty>(
            this ValidationConfiguration<TModel> validationConfiguration,
            Expression<Func<TModel, TProperty>> accessor)
        {
            return validationConfiguration.Add(accessor);
        }
}

所以我能够为 AccountHolder 调用 For 方法config.For(m => m.BankAccount.AccountHolder);

所以这很酷。它按预期发送表达式。

列表项 Transfers 变得有点困难。

在转帐中,我可能想通过表达式发送每次转帐的金额。因此,如果我有两次转账,我想发送:

m => m.BankAccount.Transfers[0].Amount
m => m.BankAccount.Transfers[1].Amount

我知道我可以这样做:

for(int i=0; i < BankAccount.Transfers.Count; i++)
            {
                config.For(m => m.BankAccount.Transfers[i].Amount);
            }

但是我不想一直为列表项这样做。

我真的很想For对列表项有一种不同的方法,我可以用一些方法来调用它,它会为我做到这一点。

我在想可能是这样的:

public static PropertyRuleSet<TModel, TProperty> For<TModel, TProperty>(
            this ValidationConfiguration<TModel> validationConfiguration,
            Expression<Func<TModel, TProperty>> accessor, int count)
        {
...
}

你可能会这样称呼它:

config.For(m => m.BankAccount.Transfers[i].Amount, BankAccount.Transfers.Count);

但是,这不起作用,因为我不确定如何在没有 i 的情况下发送表达式部分,然后稍后为每个列表项填充它。也不知道在方法中做什么

有人知道在这里做什么吗?

4

1 回答 1

1

让它返回一个列表似乎很灵巧:

public static PropertyRuleSet<TModel, TProperty> For<TModel, TProperty>(
            this ValidationConfiguration<TModel> validationConfiguration,
            Expression<Func<TModel,IEnumerator<TProperty>>> accessor)
        {
...
}

然后这个:

config.For(m => m.BankAccount.Transfers.Select(t => t.Amount));

我没有测试它,所以它可能有一个错字。

于 2012-08-14T23:02:27.677 回答