вы правы, ошибка в том, что список считает, что у него есть куча объектов метаданных, поэтому при его повторении вы получаете ссылки на метаданные, чтобы получить доступ к свойству, определенному в подклассе, вам нужно убедиться, что объект на самом деле является этим подклассом, а затем выполняет приведение.
foreach( Metadata md in metadataObjects)
{
var tmp =((Metadata<Func<double,double>>)md).Function; // but this will obviously fail if the type is incorrect.
}
так что здесь вы просто торгуете определенной ошибкой времени компиляции за потенциальную ошибку времени выполнения (в зависимости от того, что в вашем списке). Реальный вопрос: что вы хотите делать со всеми этими различными обертками делегатов функций? какой тип переменной tmp вы ожидаете?
Вы также можете попробовать решение для тестирования типа, подобное этому
foreach( Metadata md in metadataObjects)
{
var dd_md = md as Metadata<Func<double,double>>;
var id_md = md as Metadata<Func<int,double>>;
var di_md = md as Metadata<Func<double,int>>;
if(dd_md != null)
{
var tmp1 =dd_md.Function;
}
else if(id_md != null)
{
var tmp2 =id_md.Function;
}
else if(di_md != null)
{
var tmp3 =di_md.Function;
}
//etc....
}
это также может быть жизнеспособным решением, если вы точно знаете, какие типы будут присутствовать раньше времени, но это раздражает и подвержено ошибкам.