I would like to have a generic immutable data class with a list of extensions, which can be accessed using extension methods. I can do this with the following code:
public class GenericData<T> where T : unmanaged
{
public GenericData(T data, IList<IDataExtension> extensions)
{
Data = data;
Extensions = extensions.ToImmutableList();
}
public T Data { get; }
public IImmutableList<IDataExtension> Extensions { get; }
}
public interface IDataExtension { }
public static class GenericDataExtensions
{
public static TExtension GetExtension<TExtension, TDataType>(this GenericData<TDataType> data)
where TExtension : IDataExtension
where TDataType : unmanaged
{
return data.Extensions.OfType<TExtension>().First();
}
}
This works fine, but requires me to pass in TDataType every time I want to get an extension, even though the data type isn't needed for the extension method implementation.
public interface IEvenlySpacedXAxisExtension : IDataExtension
{
EvenlySpacedXAxisInfo Info { get; }
}
// later...
var xAxisInfo = data.GetExtension<IEvenlySpacedXAxisExtension, float>().Info;
I could solve this by putting GetExtension() behind an interface and making GenericData implement it:
public class GenericData<T> : IHaveDataExtensions where T : unmanaged
{
public GenericData(T data, IList<IDataExtension> extensions)
{
Data = data;
Extensions = extensions.ToImmutableList();
}
public T Data { get; }
public IImmutableList<IDataExtension> Extensions { get; }
}
public interface IDataExtension { }
public interface IHaveDataExtensions
{
IImmutableList<IDataExtension> Extensions { get; }
}
public static class IHaveExtensionsExtensions
{
public static TExtension GetExtension<TExtension>(this IHaveDataExtensions objectWithExtensions)
where TExtension : IDataExtension
{
return objectWithExtensions.Extensions.OfType<TExtension>().First();
}
}
This works, but requires an unnecessary layer of abstraction and looks pretty messy. Is there a cleaner way to achieve the same result?
