ジェネリックタイプのパラメータで特定のオブジェクトタイプのインスタンスを受け入れるクラスがある場合があります。私はは、入力時に型を定義せずにHandler<DiamondClass>
またはHandler<BaseClass>
のインスタンスを返すメソッドを作成できるようにしたいタイプを知らないジェネリックを返す
public abstract BaseClass { ... }
public DiamondClass : BaseClass { ... }
public SilverClass : BaseClass { ... }
public Handler<T> where T : BaseClass { ... }
:レイアウトは、このようなものです。どうやらHandler<DiamondClass>
がHandler<BaseClass>
に暗黙的にキャストしないので、
public Handler<BaseClass> GetHandler(HandlerType type)
{
switch(type)
{
case HandlerType.Diamond: return new Handler<DiamondClass>();
case HandlerType.Silver: return new Handler<SilverClass>();
default: throw new InvalidOperationException("...");
}
}
しかし、これは動作しません:私はこれらの線に沿って何かをしようとしました。私はこのようにそれを指定することができます。
public Handler<T> GetHandler<T>(HandlerType type) where T : BaseClass
{
switch(type)
{
case HandlerType.Diamond: return (Handler<T>)new Handler<DiamondClass>();
case HandlerType.Silver: return (Handler<T>)new Handler<SilverClass>();
default: throw new InvalidOperationException("...");
}
}
しかし、今、私はGetHandler<DiamondClass>
またはGetHandler<BaseClass>
を呼び出す必要があります。そして、型を知らなくても、列挙型に基づいて適切なハンドラを返すメソッドを持つという目的を破ります。
Type objType = typeof(DiamondClass);
var handler = Handler<objType>();
しかし、どうやらC#が愚かのようなものを許可しません:私はType
オブジェクトを定義し、そのように、それを渡すことができることを期待しました。私はこれをいくつかの方法で行ってきました。それを行う方法はあると思っていますが、私は困惑しています。
(私は実際にdynamic
オブジェクトを返すことで、この作業を取得しましたが、それはどのようなタイプの安全性とインテリセンスのサポートを失うように私は、全く可能であればそれを避けるためにしたいと思います。)
です。varハンドラ= Handler(); 'の何が問題なのですか、私はあなたが解決しようとしている問題は何も見ていません。 –
CaffGeek
ジェネリックメソッドの内部で型をチェックする必要がある場合、私はいつもそのようなメソッドの有用性に疑問を呈します。 –
@RobA説明のために例を単純化したことに留意してください。問題の一部は、それがユーザーコントロールに属したいと思っていて、デザイナーを殺してしまうため、それを一般的なものとして定義できません。 – KChaloux