如何将通用对象列表传入方法?

时间:2014-02-10 20:46:34

标签: c# linq generics

我的CheckModelValidation方法(测试单个模型)只是通过将类模型UserInsertModel作为对象传入但在我尝试传入模型列表时在单元测试中测试得很好在我的单元测试中CheckModelListValidation,它告诉我它是unknown method(因为它不喜欢我想传入的内容 - 这是List<UserInsertModel>)。

有没有更好的方法来使用泛型(我刚刚进入)?

public class ValidationManager
{
    public static void CheckModelListValidation(List<object> model)
    {
        string errorMessages = "";
        int iCnt = 0;
        foreach (var u in model)
        {
            iCnt += 1;
            string itemErrors = ValidateModel(u);
            if (!string.IsNullOrEmpty(itemErrors))
            {
                errorMessages = string.Format("Item {0} errors: {1}", iCnt, itemErrors);
            }
        }
        if (!string.IsNullOrEmpty(errorMessages))
        {
            throw new Exception(errorMessages);
        }
    }

    public static void CheckModelValidation(object model)
    {
        string errorMessages = ValidateModel(model);
        if (!string.IsNullOrEmpty(errorMessages))
        {
            throw new Exception(errorMessages);
        }  
    }

    private static string ValidateModel(object model)
    {
        string errorMessages = "";
        List<ValidationResult> validationResults = new List<ValidationResult>();
        ValidationContext valContext = new ValidationContext(model, null, null);
        bool isValid = Validator.TryValidateObject(model, valContext, validationResults, true);
        if (!isValid)
        {
            errorMessages= string.Format("Errors: {0}", String.Join("; ", validationResults.Select(v => v.ErrorMessage).ToArray()));
        }
        return errorMessages;
    }
}

这是我的实施:

UserInsertModel model = new UserInsertModel();
model.EmailAddress = "test";

List<UserInsertModel> models = new List<UserInsertModel>();
models.Add(model);
models.Add(model);

ValidationManager.CheckModelListValidation(models);

2 个答案:

答案 0 :(得分:2)

您可以使验证类具有通用性:

public class ValidationManager<T>
{
     // Change methods to accept T instead of object
     public static void CheckModelListValidation(List<T> model)
     {

     //...

     public static void CheckModelValidation(T model)
     {
      // etc

答案 1 :(得分:2)

将方法的签名更改为:

public static void CheckModelListValidation<T>(List<T> model)