【问题标题】:Access the type of a subclass from its superclass从超类访问子类的类型
【发布时间】:2021-05-24 01:16:35
【问题描述】:

我有一个超类 MySuperclass 和一个 MySuperclass 的 2 个子类; MySubclass1MySubclass2。我希望能够调用依赖于子类类型的实例方法。

例如,我希望能够在MySuperclass 的子类的任何实例上调用MySubclass.Serialize(),并让它在该对象上调用Json.SerializeToBytes<T>(T toSerialize),并酌情替换T

public class MySuperclass 
{
    // of course, this does not work.
    public byte[] SerializeToBytes() 
        => Json.SerializeToBytes<typeof(this)>(this); 
}

public class MySubclass1 : MySuperclass
{
    ...
}

public class MySubclass2 : MySuperclass
{
    ...
}

那么我可以这样做:

byte[] bytes; 
var mySubclass1Object = new MySubClass1();

bytes = mySubclass1Object.SerializeToBytes();

// the above is equivalent to (though the type parameter would normally be implied)
bytes = Json.SerializeToBytes<MySubclass1>(mySubclass1Object);

我怎样才能做到这一点?


根据评论的要求,我使用的库是 Utf8Json 库。 Json.SerializeToBytes&lt;T&gt;(T toSerialize) 定义为:**

public static byte[] SerializeToBytes<T>(T obj)
{
    return JsonSerializer.Serialize<T>(obj);
}

脚注

* 我找到了this post。但它没有回答我的问题。在这种情况下,他们可以仅使用超类的类型来引用子类,但这里的序列化程序需要访问子类及其所有额外的方法和属性才能正确序列化它。他们也没有将类型作为类型参数传递给某些方法,我需要这样做。

** 我希望它也可以在其他情况下使用,我可以从超类中定义的方法访问子类的类型。

我不想使用override,因为它需要我为每个子类重写.Serialize() 方法

【问题讨论】:

  • 这能回答你的问题吗? Practical usage of virtual functions in c#
  • 顺便Json.SerializeToBytes使用反射,所以可以看到实际传入的对象类型
  • @Charlieface 您链接的问题中的解决方案是否不需要我为每个子类创建一个新方法,覆盖超类的方法?我这样做是为了避免为 20 节课写 .Serialize()
  • 您可能会发现this 很有趣。您想将基类泛化为MySuperclass&lt;T&gt; where T : MySuperclass,这看起来很疯狂,但确实有效。然后就可以在基类中声明string Serialize&lt;T&gt;
  • 您也可以只传递this.GetType() 并使用Serialize 的非泛型重载。无需使用任何递归泛型,特别是因为您只希望它用于一个目的。换句话说,您的 SerializeToBytes 方法也可能是非泛型的。 JsonSerializer.Serialize(obj, obj.GetType())

标签: c# .net oop


【解决方案1】:

感谢@Charlieface 提供指向the explanation of this 的链接。

此实现有效,您需要转换为T

public class MySuperclass<T> where T : MySuperclass<T>
{
    public byte[] SerializeToBytes() 
        => Json.SerializeToBytes((T)this); 
}

public class MySubclass1 : MySuperclass<MySubclass1>
{
    ...
}

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 2013-03-24
    • 2017-09-13
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多