【问题标题】:Removing properties of an inherited object in C#在 C# 中删除继承对象的属性
【发布时间】:2011-12-22 21:16:19
【问题描述】:

如果我有一个复杂的对象,我可以从它继承并删除忽略某些属性吗?

如果您不关心为什么我想这样做,请随时提交答案。

如果您在乎,可以阅读this question。总结一下,我有一个对象,它有一个不可可序列化的属性,我想序列化整个对象。有问题的对象是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)。

【问题讨论】:

  • 一个异常可序列化的......至少对于二进制序列化。您使用的是哪种序列化?
  • 这并不能直接回答您的问题,但可能会有所帮助stackoverflow.com/questions/390051/…
  • @ThomasLevesque 当我用[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 装饰WebMethod 时被调用的那种我相信是JavaScriptSerializer.Serialize

标签: c# oop serialization


【解决方案1】:

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

文章相关部分:

[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's 实际上是一个非常简单的解决方法,我很乐意使用,并且更直接地回答了我的(有些通用的)问题。谢谢! +1
【解决方案2】:

您是否在不覆盖 TargetSite 属性的情况下进行了尝试?我能够做到(但不是在 2.0 中,所以我不确定它是否对你有用

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

    public MyException() : base()
    {

    }
}

【讨论】:

  • 如此简单。当我所要做的就是隐藏它时,我就是压倒一切。谢谢。
  • @jlafay 正如我在edit request 中所指出的那样,您应该使用new 关键字 将TargetSite 标记为隐藏Exception.TargetSite i> - 不这样做会产生编译器警告。
【解决方案3】:

您是否尝试过使用IgnoreDataMemberAttributeNonSerializedAttribute

[IgnoreDataMember]
// or
[NonSerialized]
public override System.Reflection.MethodBase TargetSite
{
    // ...
}

【讨论】:

  • 该属性是不可覆盖的,抽象的或虚拟的,所以我不能装饰它。
猜你喜欢
  • 2021-10-29
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多