質問をより適切に表現する方法がわかりませんが、ジェネリック インターフェイスのディクショナリを複数回作成しようとすると、次の問題に遭遇しました。多くの場合、これは、さまざまなタイプを処理するレジストリ タイプ コレクションを作成しようとしたときに発生します。
namespace GenericCollectionTest
{
[TestFixture]
public class GenericCollectionTest
{
interface IValidator<T>
{
bool Validate(T item);
}
class TestObject
{
public int TestValue { get; set; }
}
private Dictionary<Type, IValidator<object>> Validators = new Dictionary<Type, IValidator<object>>();
class BobsValidator : IValidator<TestObject>
{
public bool Validate(TestObject item)
{
if (item.TestValue != 1)
{
return false;
}
}
}
[Test]
public void Test_That_Validator_Is_Working()
{
var Test = new TestObject {TestValue = 1};
Validators.Add(typeof(BobsValidator), new BobsValidator());
Assert.That(Validators[typeof(TestObject)].Validate(Test));
}
}
}
ただし、BobsValidator をパラメータ タイプ IValidator に割り当てることができないため、コンパイルは失敗します。基本的に、バリデータの外ではタイプ セーフは必要ありませんが、内部に入ると、インターフェースの消費者が使用したいタイプにキャストする必要はありません。
Java では、次のことができます。
Dictionary<Type, IValidator<?>>
私はこのようなことができることを知っています(ala IEnumerable):
interface IValidator
{
bool Validate(object item);
}
interface IValidator<T> : IValidator
{
bool Validate(T item);
}
abstract class ValidatorBase<T> : IValidator<T>
{
protected bool Validate(object item)
{
return Validate((T)item);
}
protected abstract bool Validate(T item);
}
次に、代わりにIValidatorを辞書に取り、ValidatorBaseを拡張しますが、私が見ていないより良い方法があるに違いないようです。それとも、これは全体的なデザインが悪いだけですか? 次のような構造が必要なようです。
WhatTheHecktionary<T, IValidator<T>>
ありがとう!