I was looking at the answer of this question regarding multiple generic types in one container and I can’t really get it to work: the properties of the Metadata class are not visible, since the abstract class doesn’t have them. Here is a slightly modified version of the code in the original question:
public abstract class Metadata
{
}
public class Metadata<T> : Metadata
{
// Per Ben Voigt's comments, here are the rest of the properties:
public NUM_PARAMS NumParams { get; set; }
public FUNCTION_NAME Name { get; set; }
public List<Type> ParamTypes { get; set; }
public Type ReturnType { get; set; }
//...C
public T Function { get; set; }
public Metadata(T function)
{
Function = function;
}
}
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<Func<double,double>>(SomeFunction));
metadataObjects.Add(new Metadata<Func<int,double>>(SomeOtherFunction));
metadataObjects.Add(new Metadata<Func<double,int>>(AnotherFunction));
foreach( Metadata md in metadataObjects)
{
var tmp = md.Function; // <-- Error: does not contain a definition for Function
}
The exact error is:
error CS1061: ‘Metadata’ does not
contain a definition for ‘Function’ and no
extension method ‘Function’ accepting a
first argument of type ‘Metadata’
could be found (are you missing a
using directive or an assembly
reference?)
I believe it’s because the abstract class does not define the property Function, thus the whole effort is completely useless. Is there a way that we can get the properties?
Update
The basic idea is that I have a genetic program that uses the Metadata of functions (or MetaFunctions) in order to construct expression trees with those functions. The meta data allows me to correctly match the return from one function with the input parameters of another function… it basically turns my functions into legos and the computer can combine them in various ways. The functions are all within the same “domain”, so I won’t have any problem with randomly mixing and matching them.
I’m storing the Metadata, or MetaFunctions, into a couple of dictionaries:
- one has the name of the function as the key.
- the other has the number of parameters as the key.
In any case, I just tried to stick as close to the original question as possible… the fundamental problem is the same regardless if I use a List or a Dictionary. I’m also stuck with .NET 3.5 and I won’t be able to update to .NET 4.0 for a while.
What would you do with
md.Functionif you could read it? You can’t call it, because you don’t know the parameter types. With C# 4.0, you could usedynamic, e.g.foreach (dynamic md in metadataObjects)and then you don’t need theMetadataabstract base class. If you just want to access members ofDelegate, you could change the abstract base class to an interface which has aDelegate Metadata { get; }property and explicitly implement it inMetadata<T>, then you could access e.g. the function’s name.