определенная пользователем коллекция ошибок в Visual C # - PullRequest
2 голосов
/ 10 ноября 2010

Я хочу написать определенный пользователем класс сбора ошибок, который должен собирать все ошибки. Когда мы проверяем объект сущности, если нет ошибки, он должен пойти и сохранить в базе данных. если ошибка там, он должен отобразить это. теперь, когда я написал класс, он собирает ошибку и успешно ее отображает, но при наличии двух идентичных ошибок класс создает исключение. (Я использую код ошибки для ошибки. Значение для кода ошибки находится в файле resx, откуда метод отображения примет значение и отобразит его. Дисплей работает отлично)

//The code where it collects Error 
if (objdepartment.Departmentname == null)
{
    ErrorCollection.AddErrors("A1001","Department Name");
}
if (objdepartment.Departmentcode == null)
{
    ErrorCollection.AddErrors("A1001","Department code");
}

//In the Errorcollection  

public class ErrorCollection
{
    static Dictionary<string,List<string>> ErrorCodes;
    private ErrorCollection() { }

    public static void AddErrors(string eCode,params string[] dataItem)
    {
        if (ErrorCodes == null)
        {
            ErrorCodes = new Dictionary<string, List<string>>();
        }
        List<String> lsDataItem = new List<String>();
        foreach (string strD in dataItem)            
            lsDataItem.Add(strD);
        ErrorCodes.Add(eCode, lsDataItem);
    }

    public static string DisplayErrors()
    {
        string ErrorMessage;
        //string Key;
        ErrorMessage = String.Empty;
        if (ErrorCodes != null)
        {
            string Filepath= "D:\\Services\\ErrorCollection\\";
            //Read Errors- Language Specsific message from resx file.
            ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("ErrorMessages", Filepath, null);
            StringBuilder sb = new StringBuilder();
            foreach (string error in ErrorCodes.Keys)
            {                
                List<string> list = ErrorCodes[error];
                if (error == "A0000")
                {
                    sb.Append("System Exception : " + list[0]);
                }
                else
                {
                    sb.Append(rm.GetString(error) + "\nBreak\n");
                }

                for (int counter = 0; counter < list.Count; counter++)
                {
                    sb.Replace("{A}", list[counter]);
                }
            }
            ErrorMessage = sb.ToString();
        }
        return ErrorMessage;
    }
}    

теперь, когда есть две распространенные ошибки. затем код показывает исключение типа «ключ данных уже существует» в строке «ErrorCodes.Add (eCode, lsDataItem) ;» (курсив, где выдается исключение)

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Ну, во-первых, иметь это статически - ужасная идея. Вам нужно создать экземпляр из ErrorCollection, чтобы добавить ошибки в IMO, и сделать переменную переменной экземпляра вместо статической.

Затем вам нужно выбрать другой подход в AddErrors, предположительно добавив все новые элементы, если ключ уже существует. Примерно так:

List<string> currentItems;
if (!ErrorCodes.TryGetValue(eCode, out currentItems))
{
    currentItems = new List<string>);
    ErrorCodes[eCode] = currentItems;
}
currentItems.AddRange(dataItem);
2 голосов
/ 10 ноября 2010

Вы добавляете «A1001» дважды в качестве ключа в словаре. Это просто не разрешено. Однако более срочно - , почему этот словарь статичен ? Это означает, что все, где угодно, разделяет эту коллекцию ошибок.

Предложения:

  • сделать это не статичным (это плохая идея - также, оно не синхронизировано)
  • проверить наличие ключа и соответственно отреагировать:

    if(ErrorCodes.ContainsKey(eCode)) ErrorCodes[eCode].AddRange(lsDataItem);
    else ErrorCodes.Add(eCode, lsDataItem);
    

Кроме того, вы можете также рассмотреть возможность реализации IDataErrorInfo, который является встроенной стандартной оболочкой для этого типа функциональности, и обеспечит поддержку для сбора ошибок для работы с несколькими стандартными API-интерфейсы. Но не торопитесь, пока вам это не понадобится; p

...