2009-05-28 7 views
4

私はパラメータ化された型T ieのオブジェクトインスタンスを返したいと思います。 Foo<T>C#Genericsメソッドとxmlからメソッドで作成されたパラメータ化された型のオブジェクトを返す

タイプTは、GetType()を使用するメソッド内で、XMLファイルの文字列要素からインスタンス化されます。作成する前にクラスまたはメソッドのどちらも知っていないので、どちらもパラメータ化できません。

Foo<T>タイプのオブジェクトを非汎用メソッドから返す方法はありますか?

EDIT:

型が内部に作成され、メソッド及びクラスが両方の非汎用されている
public Foo<T> getFooFromXml(string name) { 

:これは以下のようなメソッドシグネチャですか?

答えて

1

。メソッドからFooを返すには、コンパイル時にTを知る必要があります。 Fooが実装している別のIFooがある最後の答えに関するコメントで私の提案を考えてみましょう。

class Foo<T> : IFoo { 

    public T DoSomething() { 
     ... 
    } 

    object IFoo.DoSomething() { 
     return DoSomething(); 
    } 

} 

interface IFoo { 
    object DoSomething(); 
} 
+0

ありがとうございます。私はジェネリックFooで提案したものを非汎用IFooを実装して使用しています。 – theringostarrs

8

ええ、基本的にオープンジェネリック型を取得し、クローズジェネリック型を作成する必要があります。

Type openType = typeof(Foo<>); 
Type closedType = openType.MakeGenericType(typeof(string)); 

return Activator.CreateInstance(closedType); // returns a new Foo<string> 

編集:私は(Fooの<>)typeof演算を使用したことに注意上記、私は意図的に空の山括弧を残しました。メソッドのシグネチャはとにかく有効でないことを

:あなたの編集に対応して

+1

ニースの編集 - 私は、(あまり一般的ではない)オープンタイプの構文で混乱している人々を見てきました。 –

+0

あなたはtypeof(string)をGetType(typeName)に置き換える必要がありますか? – Randolpho

+1

Activator.CreateInstanceはオブジェクトを返します。あなたはそれをFooにさらにキャストし、それをFooとして使うことができますか?私が考えることができる唯一の方法は、オブジェクトから必要なメソッド/プロパティを取得するためにリフレクションを使用し、そこから取得することです。私は他の方法を参照してください... – BFree

関連する問題