4

私は、再利用可能なアセンブリがたくさんあるC#.NETソリューションに取り組んでいます。これらのうちの3つは次のとおりです。

  • WinFormsアセンブリ
  • webclientクラスライブラリ
  • データモデルクラスを含むアセンブリ

クラスライブラリには、次のようなジェネリックメソッドがあります。

namespace Company.WebClient {
  public class GetData<T>()
  {
    ...
  }
}

ただし、WinFormsアセンブリ内からメソッドを呼び出すと、データモデルアセンブリに含まれているため、クラスライブラリが認識できない型を渡します。

namespace Company.WinFormsApp {
  public class App 
  {
    public void Main()
    {
      Company.WebClient.GetData<TypeFromTheDataModel>();
    }
  }
}

驚いたことに、それはうまくいくようです。しかし、なぜそれが機能するのですか?webclientアセンブリには、データモデルアセンブリへのハードコードされた参照がないため、「typenotfound」またはそのようなエラーが報告されないことに驚いています。これは安全な作業方法ですか、それともプロジェクトへの参照を追加する必要がありますか(つまり、クラスライブラリからデータモデルへ)?

4

2 に答える 2

2

ライブラリはタイプについて何も知る必要はありません。結局のところ、ライブラリはタイプのメンバーを使用しようとはしていません。実行時に-について知ることGetData ができTますが、コンパイル時にそれを知る必要はありません。

考えてみてください。これが機能しなかった場合、LINQ to Objectsは完全に壊れてしまいます。これは、システムタイプのシーケンスにしか使用できないためです。

基本的に、これを行うのは完全に安全です。

于 2012-07-06T12:47:45.870 に答える
1

これが基本的にジェネリックのポイントです。CLRは、実行時に、使用する型を定義する特定のクラスを認識していますT。そして、あなたが書いたコードはGetData、タイプのオブジェクトをどうするかを示していますTCLRはステッチを提供するので、それについて考える必要はありません。

この例では、制約を設定していないことに注意してください(句Tはありません)。whereつまり、-typeオブジェクトでできることは、Tそれらをとして扱うことだけですがobject、これはそれほど便利ではありません。たとえば、インターフェイスを実装するように制約しIMoreInterestingた場合、ライブラリと呼び出し元の両方がの定義にアクセスする必要があるのは確かですIMoreInteresting

于 2012-07-06T12:48:24.137 に答える