: new()
型にパラメーターなしのコンストラクターがあるかどうかを確認して、それをキャストし、制約付きのパラメーターなしのコンストラクターを必要とするメソッドを呼び出すことはまったく可能ですか?
ターゲット メソッドの呼び出しが許可されないため、ここで回答されているように、タイプがパブリック パラメータなしであることを確認できるだけでは十分ではありません。
IInteresting
目的は、オブジェクトが public パラメーターなしのコンストラクターを実装せず、 を呼び出す前に変換する必要がある、次のロジックを持つことSave1
です。
public interface IInteresting { }
public void Save<T>(T o) {
var oc = o as (new()); /* Pseudo implementation */
if (oc != null) {
this.Save1(oc);
}
else {
var oi = o as IInteresting;
if (oi != null) {
this.Save2(oi);
}
}
}
private void Save1<T>(T o) where T : new() {
//Stuff
}
private void Save2<T>(IInteresting o) {
//Stuff to convert o to a DTO object with a public parameterless constructor, then call Save1(T o)
}
もちろん、問題を解決する同じ署名を作成Save1
してSave2
共有できれば問題は解決しますが、次のコードはコンパイルされないため、その方法が見つかりません (ではRoutine
、Save
2 番目の実装ではなく最初の実装が呼び出されます)。
public void Routine<T>(T o) {
var oi = o as IInteresting;
if (oi != null) {
this.Save(oi);
}
}
private void Save<T>(T o) where T : new() {
//Stuff
}
private void Save<T>(IInteresting o) {
//Stuff to convert o to a DTO object with a public parameterless constructor, then call Save(T o)
}