3

私は次のようにMethodInfoMakeGenericMethodを使用しようとしています。

        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);
    }

私が抱えている問題は、渡した型が'new()'ではないため、MakeGenericMethod行で引数の例外が発生することです。

これを回避する方法はありますか?ありがとう

4

1 に答える 1

5

いいえ。制約IThingyを満たす型パラメーターを使用して、閉じて構築されたTryConstructメソッドのみを作成できます。newそうしないと、TryConstructコントラクトを無効にすることになります。TryConstructを呼び出してnew T()ラインに到達するとどうなるでしょうか。T()コンストラクターがないため、型の安全性に違反していることになります。

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

于 2010-03-03T22:18:02.580 に答える