インターフェイスの型から、基本クラスから拡張されたそのインターフェイスの実装にマップするディクショナリを実装する小さなクラスがあります。残念ながら、抽象基本クラスはインターフェイスを実装していないため、一度辞書に入ると、2 つを関連付ける方法はないようです。このクラスには、オブジェクトを BaseClass として格納することに依存する別のメソッドがあります (実際、私のクラスのほとんどはそれに依存しています。ディクショナリへのゲッターは多少便利です)。
private readonly Dictionary<Type, BaseClass> dictionary;
public void Add<T>(BaseClass base)
{
if (!(base is T)) // How to get rid of this check?
{
throw new ArgumentException("base does not implement " + typeof(T).Name);
}
this.dictionary.Add(typeof(T), base);
}
public T Get<T>()
{
BaseClass base;
this.dictionary.TryGetValue(typeof(T), out base);
return (T)(object)base; // How to get rid of (object) cast?
}
(ベースは T) チェック、オブジェクトへのキャスト、またはその両方を削除するために使用できる巧妙な制約はありますか?
参考までに、クラスのセットアップは次のとおりです。
class BaseClass { }
interface IThing { }
class MyClass : BaseClass, IThing { }
dict.Add<IThing>(new MyClass());
IThing myClass = dict.Get<IThing>();