Как я могу добавить свойство к классу динамически - PullRequest
3 голосов
/ 11 февраля 2010

Я хочу создать класс ошибок. И у него есть некоторые статические свойства. Например: Message, InnerException, Stacktrace, Source. Но я хочу добавить некоторые динамические свойства.

Если исключение FileNotFoundException, я хочу добавить свойство FileName.

Или, если это SqlException, я хочу добавить свойство LineNumber. И я не могу унаследовать этот класс от Exception, потому что я возвращаю этот класс из веб-службы. Как я могу это сделать?

Ответы [ 6 ]

2 голосов
/ 11 февраля 2010

Вместо того, чтобы пытаться что-то делать, C # в настоящее время работает не очень хорошо, я предлагаю вам использовать несколько иной подход.

Почему бы вам не добавить эти дополнительные свойства как данные в словарь? Ваш класс может предоставить интерфейс для получения ряда «свойств» (в общем смысле этого слова), то есть ключи и ваш вызывающий код могут затем изучить их и использовать их для поиска значений по мере необходимости.

2 голосов
/ 11 февраля 2010

C # - статически типизированный язык. Это означает, что вы, как правило, не можете динамически добавлять свойства к классам во время выполнения без каких-либо действительно прикольных вставок IL (которых вы определенно хотите избежать).

В вашем случае кажется, что вам нужно немного лучше понять исключения - мы обычно генерируем исключение определенного типа, чтобы указать причину исключительной проблемы. Например, если вы ищете файл, а его там нет, вы бы сгенерировали исключение FileNotFoundException или, если есть какая-то специфическая проблема приложения, вы можете создать свой собственный класс исключений и выбросить это исключение.

Имейте в виду, что исключения должны быть исключительными.

1 голос
/ 11 февраля 2010

Я бы хотел использовать словарь, в котором можно хранить все дополнительные данные.

public class Logging
{
    private Dictionary<string, string> _ExtraInfo = new Dictionary<string, string>();

    public Dictionary<string, string> ExtraInfo {
        get { return _ExtraInfo; }
        set { _ExtraInfo = value; }
    }

}

Для использования:

   Logging MyLogger = new Logging();
   MyLogger.ExtraInfo.Add("Filename", thefilename);
   MyLogger.ExtraInfo.Add("ClientTime", now);

И так далее.

1 голос
/ 11 февраля 2010

вы можете создавать тип динамически, используя новые функции в C #, такие как анонимные типы

Я не уверен, пытаетесь ли вы сделать что-то похожее, но можете выполнить требование следующим образом

        public interface IError { }

        public class ErrorTypeA : IError
        { public string Name; }

        public class ErrorTypeB : IError
        {
            public string Name;
            public int line;
        }

        public void CreateErrorObject()
        {
            IError error;
            if (FileNotFoundException) // put your check here
            {
                error = new ErrorTypeA
                    {
                        Name = ""
                    };
            }
            elseif (InValidOpertionException) // put your check here
            {
                error = new ErrorTypeB
                {
                    Name = "",
                    line = 1
                };
            }
        }

Надеюсь, это поможет

0 голосов
/ 11 февраля 2010

Создать новый тип исключения, производный от Exception. Бросьте это исключение и присвойте свойству InnerException исключение, вызвавшее весь шум.

Вы можете проверить тип внутреннего исключения и соответственно отобразить данные.

Если возможно, вы можете, конечно, просто throw оригинальное исключение, чтобы вызывающая сторона обрабатывала его.

0 голосов
/ 11 февраля 2010

Очень неясно, чего вы пытаетесь достичь. Пересмотрите свой дизайн в пользу нестатических классов и используйте наследование.

И вы помните, что в .NET BCL есть много готовых классов исключений, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...