如何在方法中动态设置表达式类型

时间:2012-08-14 22:51:32

标签: c# linq expression

我有这个视图模型:

    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 config.For(m => m.BankAccount.AccountHolder);

调用For方法

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

列表项目转移变得有点困难。

在转移中,我可能希望通过表达式发送每次转移的金额。所以,如果我有两次转移,我想发送:

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的情况下发送表达式部分,然后为每个列表项填充它。也不知道该怎么做

任何人都知道该怎么做?

1 个答案:

答案 0 :(得分:1)

让它返回一个列表似乎是linqy:

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));

我没有测试过,所以它可能会有拼写错误。