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