「新しい()」タイプの制約を有する方法でMakeGenericMethodを使用してC#のリフレクション、

StackOverflow https://stackoverflow.com/questions/2375422

質問

私は次のように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例外を取得することではないです

このラウンド方法はありますか? おかげ

役に立ちましたか?

解決

はありません。あなただけIThingynew制約を満たす型パラメータを持つTryConstruct方法を構築閉鎖することができます。そうしないと、TryConstruct契約を破っているはずだ:あなたはTryConstructと呼ばれ、それがnew T()ラインをヒットしたときに何が起こりますか? が存在しないだろう。のT()コンストラクタ、あなたは型の安全性に違反していると思いますので。

あなたはタイプがMakeGenericMethodに渡す前に、パブリックデフォルトコンストラクタを持っていることを確認する必要があります。デフォルト以外のコンストラクタでインスタンス化の種類に必要な場合は、新しいメソッドまたはTryConstructの過負荷、代わりにnew T()のActivator.CreateInstanceを使用して、おそらく1を作成する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top