My tiny mind can’t come up with an elegant solution to this problem. Suppose I have class such as this:
public class Foo<T>
{
public RecordType Type { get; set; }
public T Value { get; set; }
}
Where RecordType may look something like this:
public enum RecordType
{
EmptyRecord,
BooleanRecord,
IntegerRecord,
StringRecord,
ByteRecord
}
The goal is to treat an IEnumerable<Foo<T>> uniformly for an iteration and/or to switch on the RecordType and perform an action while avoiding boxing the intrinsic types if at all possible. In addition, it would be nice to use a factory to create these Foo‘s off of a factory method.
I’ve fumbled with a few quick implementations of commonality in base class or interface and nothing I came up with answered this, seemingly, very simple problem elegantly.
Small edit:
I should’ve mentioned that my primary goal is to use the .Value without forcing a cast on the caller.
You could introduce a non-generic interface IFoo:
which is implemented by the generic Foo class:
and create a factory method that creates a Foo instance depending on RecordType:
Once you’ve created a Foo instance this way, you can’t access the value yet, because you don’t know the type parameter yet. But you can check for the type using the Type property and do the appropriate cast:
If you have a method that works with Foo objects, for example:
and have an enumerable of IFoo objects, you can Cast/OfType that:
So, essentially, you use Foo<T> when you know T at compile-time, and IFoo if you know T only at run-time. IFoo requires a check to turn it into a Foo<T> for some T at run-time.