如何动态地向类添加属性

时间:2010-02-11 13:14:45

标签: c# exception-handling class

我想创建一个错误类。它有一些静态属性。例如:MessageInnerExceptionStacktraceSource。但我想添加一些动态属性。

如果异常是FileNotFoundException,我想添加FileName属性。

或者如果它是SqlException,我想添加LineNumber属性。我无法从Exception继承该类,因为我从Web服务返回该类。我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:2)

C#是一种静态类型语言。这意味着你通常不能在运行时动态地向类添加属性而没有一些非常时髦的IL注入(你肯定想要避免)。

在您的情况下,您似乎需要更好地理解异常 - 我们通常会抛出特定类型的异常来指示异常问题的原因。例如,如果您正在查找文件并且它不在那里您将抛出FileNotFoundException,或者如果存在某些特定于应用程序的问题,您可以创建自己的异常类并抛出该异常。

请记住,例外应该是例外。

答案 1 :(得分:2)

我建议你采用一种不同的方法,而不是试图做一些C#目前处理得不好的事情。

为什么不在字典中将这些额外的属性添加为数据?你的类可以暴露一个接口以获得许多“属性”(在一般意义上的单词),即键和你的调用代码然后可以检查这些并使用它们来查找必要的值。

答案 2 :(得分:1)

您可以使用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
                };
            }
        }

希望这有帮助

答案 3 :(得分:1)

我对此的看法是使用字典来存储所有额外数据。

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

等等。

答案 4 :(得分:0)

目前还不清楚你想要实现的目标。重新考虑您的设计,转而使用非静态类并使用继承。

你确实记得.NET BCL中有很多现成的异常类,对吗?

答案 5 :(得分:0)

创建一个派生自Exception的新异常类型。抛出此异常,并将InnerException属性设置为导致所有骚扰的异常。

您可以检查内部异常的类型并相应地显示数据。

如果可能的话,你当然也可以throw让原来的操作人员处理它。{/ p>