2

これに似た工場があるとしましょう:

public static class BusinessObjectFactory
{
   public static T Create<T>(int objectId) where T : BusinessObject, new()
    {
        var dataSource = DataLayer.DataSources.Repository.Get<T>();
        var serializer = DataLayer.Serializers.Repository.Get<T>();

        var businessObject = new T {ObjectId = objectId, DataSource = dataSource, Serializer = serializer};

        return businessObject;
    }
}

これは、ObjectId、DataSource、Serializerのパブリックアクセサーがあれば機能します。

TがBusinessObjectとして制約されており、BusinessObjectにはその種のコンストラクターがあることを知っているので、タイプTコンストラクターでこれらの引数を指定したいと思います。

新しいTへの呼び出しを次のようなものに置き換えることができることを私は知っています。

var businessObject = (T) Activator.CreateInstance(typeof (T), objectId, dataSource, serializer);

しかし、私のTコンストラクターがパラメーターなしでなければならない技術的な理由は何ですか?ジェネリックについてはわからないことがある気がします。そのトピックに関連するいくつかの質問がSOに浮かんでいるのを見てきましたが、本当に私を啓発した答えはありません。

4

2 に答える 2

2

ジェネリックはコンパイル時のアーティファクトです。これは、コンパイル時に、新しく生成された適切なクラスがあることを意味します。

コンパイル時に、ctorのパラメーターはまだ識別できませんでした(定数でない場合)。

そのため、「空の」コンストラクターが必要です。CLRは、タイプのオブジェクトを構成できます。

于 2012-07-18T07:16:39.310 に答える
0

new()パラメーターのないコンストラクターがあることを指定する制約のみがあります。その型にT(ObjectId, DataSource, Serializer)コンストラクターが必要であることを指定する方法はありません。ジェネリックス制約ではなく、インターフェースやベースクラスでもありません。

于 2012-07-18T07:16:46.290 に答える