Я нашел решение, которое решает мою проблему, которую я не смог решить с помощью шаблонов / шаблонов.
Создайте новый скалярный класс
Class Scalar
{
private byte dataByte = 0;
private short dataShort = 0;
// ... int, long, float, double
private string dataString = 0;
private List<Variable> dataList = null;
//constructors for "later" type casting (see below)
public Scalar(byte data)
{
this.dataByte = data;
}
//* repeat this for short, int, long, float, double, string, List<>
//implicit conversions for getting data out
public static implicit operator byte(Scalar scalar)
{
return scalar.dataByte;
}
//* repeat this for short, int, long, float, double, string, List<>
//implicit conversions for getting data in (invokes a constructor)
public static implicit operator Scalar(byte data)
{
return new Scalar(data);
}
//* repeat this for short, int, long, float, double, string, List<>
}
Затем создайте класс моей базовой переменной
abstract class Variable
{
public Scalar Data
{
get { return data; }
set { data = value; }
}
protected Scalar data = new Scalar(0);
/* other meta information etc */
}
Затем создайте ваши подклассы из ваших метапеременных
class MetaByte : Variable
{
public byte Data
{
get { return data; }
set { data = value; }
}
/* byte specific features */
}
Затем с помощью динамического связывания он прекрасно работает
Variable scalar = new MetaByte();
scalar.Data = 33;
scalar = new MetaList();
scalar.Data = new List<Variable>();
Он не идеален для списков, нокажется, это работает для того, как я собираюсь использовать его.