Во первых не совсем понятно какой деструктор Вы хотите. Если такой как в С++, то в C# такого нет по причине существования GC. Если Вы хотите метод, который будет выполняться перед сборкой мусора, то нужно реализовать IDisposable. И даже если Вы явным образом вызовите Finalize, то в какой момент он выполнится, никто гарантии не даст, как GC решит.
Во вторых, C# язык строго типизированный, а значит нужно каким то образом ему понимать, какого типа будет headerA и headerB. Значит для них нужно определить тип
class HeaderA
{
public string Signature {get;set;}
public DateTime CreatedDate {get;set;}
public int Version {get;set;}
}
class HeaderB
{
public string Signature {get;set;}
public DateTime CreatedDate {get;set;}
public long AuthorId {get;set;}
public string MagicString {get;set;}
}
затем инкапсулируете их
public class A<TData>
{
//header
public HeaderA Header {get;set;}
//data
public TData Data {get;set;}
}
public class B<TData>
{
//header
public HederB Header {get;set;}
//data
public TData Data {get;set;}
}
Видно, что можно еще обобщить и сделать
class HederData<THeder, TData>
{
public THeder Header {get;set;}
public TData Data {get;set;}
}
Теперь объекты можно создавать таким образом
var a = new DataHaeder<HeaderA, string>();
var b = new DataHeader<HeaderB, int>();
Ну вот собственно мы и получили объект с полями, какими Вы хотите
(var headerA, dataA)
a.Header и a.Data, b.Header и b.Data;
И, кстати, общие поля можно вынести в один класс
class CommonProp
{
public string Signature {get;set;}
public DateTime CreatedDate {get;set;}
}
А потом хедеры от него отнаследуйте.
class HeaderA : CommonProp
{
public int Version {get;set;}
}
class HeaderB : CommonProp
{
public long AuthorId {get;set;}
public string MagicString {get;set;}
}