「新しい()」タイプの制約を有する方法でMakeGenericMethodを使用してC#のリフレクション、
-
24-09-2019 - |
質問
私は次のようにMETHODINFO MakeGenericMethodを使用しようとしています。
foreach (var type in types)
{
object output = null;
var method = typeof (ContentTypeResolver).GetMethod("TryConstruct");
var genmethod = method.MakeGenericMethod(type);
var arr = new object[] { from, output };
if ((bool)genmethod.Invoke(null, arr))
return (IThingy)arr[1];
}
以下の一般的な方法に対する
public static bool TryConstruct<T>(string from, out IThingy result) where T : IThingy, new()
{
var thing = new T();
return thingTryConstructFrom(from, out result);
}
私が持つ問題点は、「新しい()」
私は渡していますタイプとしてMakeGenericMethodライン上arguement例外を取得することではないですこのラウンド方法はありますか? おかげ
解決
はありません。あなただけIThingy
とnew
制約を満たす型パラメータを持つTryConstruct方法を構築閉鎖することができます。そうしないと、TryConstruct契約を破っているはずだ:あなたはTryConstructと呼ばれ、それがnew T()
ラインをヒットしたときに何が起こりますか? が存在しないだろう。のT()コンストラクタ、あなたは型の安全性に違反していると思いますので。
あなたはタイプがMakeGenericMethodに渡す前に、パブリックデフォルトコンストラクタを持っていることを確認する必要があります。デフォルト以外のコンストラクタでインスタンス化の種類に必要な場合は、新しいメソッドまたはTryConstructの過負荷、代わりにnew T()
のActivator.CreateInstanceを使用して、おそらく1を作成する必要があります。
所属していません StackOverflow