インターフェイスと、インターフェイスを実装する2つのクラスがあります。クラスにはジェネリック型があります。あるクラスのインスタンスから別のクラスにクローンを作成したいと思います。
interface IFoo
{
// stuff
}
class Foo<T> : IFoo
{
// foo stuff
// ifoo implementation
}
class Bar<T> : IFoo
{
// bar stuff
// ifoo implementation
}
私はフーを持っていて、バーが欲しいです。Barには、IFooのパラメーターを受け取るコピーコンストラクターがあります。クローンを実装するための拡張メソッドを作成しました。
public static Bar<T> Clone<T>(this IFoo foo)
{
return new Bar<T>(foo);
}
メソッドを呼び出すには、次のタイプが必要です。
someFoo.Clone<T> ...
拡張メソッドを変更してメソッドを呼び出すときに型の宣言を省略する方法、またはその他の方法で、基になる型を気にせずにインスタンスを渡すことができるようにする方法はありますか?
更新 これは、状況をよりよく説明するためにこれがどのように使用されているかです。
メソッドでは、コレクションを繰り返し、IFooの列挙を返します。このメソッドでは、ソースコレクションの属性を調べて、Fooのタイプを判別します。
IFoo foo = null;
string type = element.Attribute("Type").Value;
switch (type)
{
case "int":
foo = new Foo<int>();
break;
case "string":
foo = new Foo<string>();
break;
// etc
}
// other stuff
yield return foo;
呼び出し元のメソッドにはリストがあります。後で、このリストから個々のアイテムを選択して使用します。その時点で、FooではなくBarが必要です。リストから選択すると、インスタンスはタイプIFooであり、「thisIFoofoo」の拡張メソッドのみが表示されます。IFooをFooにキャストしたくないので、Tのタイプを再宣言する必要があります。FooにBarにそれが何であるかを伝えてもらいたいだけです。これは可能ですか?