在C#中移除继承对象的属性

3
如果我有一个复杂的对象,我能从中继承并删除或忽略某些属性吗?
如果您不关心为什么我要这样做,可以直接提交答案。
如果您在意,您可以阅读此问题。总结一下,我有一个对象,其中有一个不可序列化的属性,并且我想序列化整个对象。所涉及的对象是System.Exception。
为了解决这个问题,我想简单地创建自己的JsonException对象,继承基类(System.Exception)的所有属性,除了删除(或清空)特定属性(Exception.TargetSite)。
类似于:
public class MyException : Exception
{
    // Note this is not actually possible
    //      just demonstrating what I thought to do in theory
    public override System.Reflection.MethodBase TargetSite
    {
        get
        {
            return null;
        }
    }

    public MyException(string message)
        : base()
    {
    }
}

请注意,我被困在.NET 2.0中,如果不必要,我真的不想使用自定义序列化程序(如Json.NET)。


一个异常可序列化的...至少在二进制序列化方面是这样。你正在使用哪种类型的序列化? - Thomas Levesque
这并没有直接回答你的问题,但可能会有所帮助。https://dev59.com/MHRC5IYBdhLWcg3wKtz2 - Prescott
@ThomasLevesque 这种方法会在我使用[ScriptMethod(ResponseFormat = ResponseFormat.Json)]装饰一个WebMethod时被调用,我相信它是JavaScriptSerializer.Serialize - Terry
3个回答

5

请参见“定义异常类”段落的这里,了解如何创建自定义可序列化异常。

来自文章的相关部分:

[Serializable()]
public class InvalidDepartmentException : System.Exception
{
    public InvalidDepartmentException() : base() { }
    public InvalidDepartmentException(string message) : base(message) { }
    public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { }

    // A constructor is needed for serialization when an
    // exception propagates from a remoting server to the client. 
    protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info,
        System.Runtime.Serialization.StreamingContext context) { }
}

这是一个很好的答案,但jlafay的解决方法实际上是一个非常简单的解决方案,我感到很舒适并且回答了我的(有些泛泛的)问题。谢谢!+1 - Terry

1

您尝试过不覆盖TargetSite属性吗?我能够做到这一点(但不是在2.0中,所以我不确定它是否能像这样为您工作)

public class MyException : Exception
{
    public new System.Reflection.MethodBase TargetSite
    {
        get { return null; }
    }

    public MyException() : base()
    {

    }
}

1
太简单了。我本来只需要隐藏它,而不是覆盖它。谢谢。 - Terry
1
@jlafay,正如我在编辑请求中所指出的那样,您应该使用new关键字来标记TargetSite为隐藏的Exception.TargetSite——如果不这样做,将会生成编译器警告。 - Adam

0

该属性不可重写、抽象或虚拟,所以很遗憾我无法修饰它。 - Terry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接