私が正しく理解していれば、あなたはジェネリック型パラメータは変更になる場合がありますジェネリック型のコレクションを格納しようとしています。このような場合は、次の例が示すように、それは、直接ことはできません。
// 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? ... */ >>();
ここには明らかなはずである何、どのタイプのパラメータを使用するにはを推測することは不可能であるということです。代わりに(あなたの例に関して)、あなたの代わりにこのような何かをしたいことがあります。
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() }
};
}
}
これは、ソリューションの最もエレガントではないかもしれないが、それはあなたが同じコレクション内の別のジェネリック型を格納できるようになります。しかし、この問題は、そのようなコレクションにアクセスする呼び出し側がどの型をキャストすべきかを知る必要があることです。たとえば:これでそう
// ... Inside SomeContainer ...
public IOperandFactory<T> GetFactory<T>()
{
return (IOperandFactory<T>)factoryDict[typeof(T)];
}
、あなたはDoubleFactory
を使用して取得することができます。
IOperandFactory<double> doubleFactory = mSomeContainerInstance.GetFactory<double>();
IOperand<double> emptyOperand = doubleFactory.CreateEmptyOperand();
IOperand<double> filledOperand = doubleFactory.CreateOperand(1.0d);
を素早く答えてくれてありがとう。 – Danil
@ダニル私はそれが役に立ったならば、完全な例で編集した –
うん、ありがとう、私はそれが他のユーザーにも便利だと思う。 – Danil