Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向类动态添加属性_C#_Exception Handling_Class - Fatal编程技术网

C# 如何向类动态添加属性

C# 如何向类动态添加属性,c#,exception-handling,class,C#,Exception Handling,Class,我想创建一个错误类。它有一些静态特性。例如:消息,内部异常,堆栈跟踪,源。但是我想添加一些动态属性 如果异常是FileNotFoundException,我想添加FileName属性 或者,如果它是SqlException,我想添加LineNumber属性。我不能从Exception继承该类,因为我从web服务返回该类。我该怎么做 现在还不清楚你想要实现什么。重新考虑您的设计,支持非静态类并使用继承 您还记得.NET BCL中有很多现成的异常类,对吗?C#是一种静态类型语言。这意味着您通常无法在

我想创建一个错误类。它有一些静态特性。例如:
消息
内部异常
堆栈跟踪
。但是我想添加一些动态属性

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


或者,如果它是
SqlException
,我想添加
LineNumber
属性。我不能从
Exception
继承该类,因为我从web服务返回该类。我该怎么做

现在还不清楚你想要实现什么。重新考虑您的设计,支持非静态类并使用继承

您还记得.NET BCL中有很多现成的异常类,对吗?

C#是一种静态类型语言。这意味着您通常无法在运行时动态地将属性添加到类中,而不进行一些非常时髦的IL注入(这是您绝对希望避免的)

在您的案例中,您似乎需要更好地理解异常——我们通常抛出特定类型的异常,以指示异常问题的原因。例如,如果您正在查找一个文件,但它不在那里,则会引发FileNotFoundException,或者如果存在某些特定于应用程序的问题,则可以创建自己的异常类并引发该异常


请记住,异常应该是异常的。

与其尝试做一些C#目前处理得不太好的事情,我建议您采取一些不同的方法


为什么不把这些额外的属性作为数据添加到字典中呢?您的类可以公开一个接口来获取一些“属性”(一般意义上的属性),即键和调用代码可以检查这些属性,并根据需要使用它们来查找值

创建一个新的异常类型,从异常派生。抛出此异常,并将InnerException属性设置为引起所有骚动的异常

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


如果可能的话,您当然也可以抛出原始的expetion,让调用者处理它。

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

希望这有帮助

我对这一点的理解是使用一个可以存储所有额外数据的字典

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