ジェネリックメソッドからオブジェクトを構築したいと思います。このオブジェクトはコンストラクタ内でstring
をとります。このようなもの:ジェネリックオブジェクト(デフォルトのコンストラクタではない)を構築する
public T GetObject<T>()
{
return new T("Hello");
}
これは可能ですか?
ジェネリックメソッドからオブジェクトを構築したいと思います。このオブジェクトはコンストラクタ内でstring
をとります。このようなもの:ジェネリックオブジェクト(デフォルトのコンストラクタではない)を構築する
public T GetObject<T>()
{
return new T("Hello");
}
これは可能ですか?
1つのオプションは、呼び出しサイトは、もしそうなら、 `(この
GetObject(x => new T(x));
コンストラクタが本当に存在する場合は、[はい、だけコンパイル時間なしチェック:どこにあなたがそれらを定義することはできませんので、あなたがジェネリック型でパラメータ化コンストラクタを使用することはできません現時点ではActivator.CreateInstance
public T GetObject<T>()
{
return (T)Activator.CreateInstance(typeof(T), "Hello");
}
のように見えるように修正されるだろう
public T GetObject<T>(Func<string,T> func) { return func("Hello"); }
/ラムダファクトリメソッドに渡すために、発信者を強制的にこれを書き換えることです文字列) 'コンストラクタが存在しない場合、実行時エラーになりますか? – Smashery
@Smashery:そうです。 'T'がパブリック'(文字列) 'コンストラクタを持たない場合、例外をスローします。 – dtb
ありがとうございました!私は1つの "正解"を選ぶことができますが、何か新しいことを教えてくれてありがとう! – Smashery
番号を。
Activatorを使用することは同じではありません - 私はあなたの質問に対する答えではないと信じていますが、もちろん使用できます。
メソッドのシグネチャはdtbのソリューションよりもはるかに複雑になりますが、コンパイル時のチェックが必要です。トレードオフだと思います。 – Smashery