2010-11-22 6 views

答えて

7

1つのオプションは、呼び出しサイトは、もしそうなら、 `(この

GetObject(x => new T(x)); 
+0

メソッドのシグネチャはdtbのソリューションよりもはるかに複雑になりますが、コンパイル時のチェックが必要です。トレードオフだと思います。 – Smashery

11

コンストラクタが本当に存在する場合は、[はい、だけコンパイル時間なしチェック:どこにあなたがそれらを定義することはできませんので、あなたがジェネリック型でパラメータ化コンストラクタを使用することはできません現時点ではActivator.CreateInstance

public T GetObject<T>() 
{ 
    return (T)Activator.CreateInstance(typeof(T), "Hello"); 
} 
+0

のように見えるように修正されるだろう

public T GetObject<T>(Func<string,T> func) { return func("Hello"); } 

/ラムダファクトリメソッドに渡すために、発信者を強制的にこれを書き換えることです文字列) 'コンストラクタが存在しない場合、実行時エラーになりますか? – Smashery

+0

@Smashery:そうです。 'T'がパブリック'(文字列) 'コンストラクタを持たない場合、例外をスローします。 – dtb

+0

ありがとうございました!私は1つの "正解"を選ぶことができますが、何か新しいことを教えてくれてありがとう! – Smashery

0

番号を。

Activatorを使用することは同じではありません - 私はあなたの質問に対する答えではないと信じていますが、もちろん使用できます。

関連する問題