Si he entendido bien, que están tratando de almacenar una colección de tipos genéricos, donde los parámetros de tipo genérico pueden variar. Si este es el caso, no es directamente posible, como ilustra el siguiente ejemplo:
// You have lists of different types:
List<double> doubleCollection = new List<double>();
List<string> stringCollection = new List<string>();
// Now to store generically:
var collection = new List<List< /* ... Which type parameter to use? ... */ >>();
Lo que debería ser evidente aquí, es que no es posible deducir que el parámetro tipo de uso. En su lugar (con respecto a su ejemplo), es posible que desee algo como esto en su lugar:
public interface IOperand
{
}
public interface IOperand<T>
{
}
public interface IOperandFactory
{
IOperand CreateEmptyOperand();
IOperand CreateOperand(object value);
}
public interface IOperandFactory<T> : IOperandFactory
{
new IOperand<T> CreateEmptyOperand();
IOperand<T> CreateOperand(T value);
}
public class DoubleFactory : IOperandFactory<double>
{
public IOperand<double> CreateEmptyOperand()
{
throw new NotImplementedException();
}
public IOperand<double> CreateOperand(double value)
{
throw new NotImplementedException();
}
IOperand IOperandFactory.CreateEmptyOperand()
{
throw new NotImplementedException();
}
public IOperand CreateOperand(object value)
{
throw new NotImplementedException();
}
}
public class SomeContainer
{
public SomeContainer()
{
var factoryDict = new Dictionary<Type, IOperandFactory>()
{
{ typeof(double), (IOperandFactory)new DoubleFactory() }
};
}
}
esto puede no ser la más elegante de las soluciones, pero permitiría que le permite almacenar diferentes tipos genéricos de la misma colección. Un problema con esto, sin embargo, es que la persona que llama que accede a dicha colección necesitaría saber a qué tipo enviarla. Por ejemplo:
// ... Inside SomeContainer ...
public IOperandFactory<T> GetFactory<T>()
{
return (IOperandFactory<T>)factoryDict[typeof(T)];
}
Así que con esto, se puede obtener el DoubleFactory
usando:
IOperandFactory<double> doubleFactory = mSomeContainerInstance.GetFactory<double>();
IOperand<double> emptyOperand = doubleFactory.CreateEmptyOperand();
IOperand<double> filledOperand = doubleFactory.CreateOperand(1.0d);
Gracias por la respuesta rápida. – Danil
@Danil Edité en un ejemplo completo, si ayuda –
Sí, gracias, creo que también será útil para otros usuarios. – Danil