.NETでは、「アセンブリ+名前」の組み合わせで型を厳密に判定します。 その結果、異なるアセンブリでまったく同じ名前の型を定義しても、それぞれ別の型として扱われます。 これは、人的ミスの削減や、悪意あるコードへの耐性につながる一方で、 型の定義場所を移動させたいときに困ります。

そこで.NETは、型の検索の際に、別のアセンブリに転送する仕組みを提供しています。 これを型フォワーディング(Type Forwarding)と呼びます。

目次

概要

.NETでは、「アセンブリ+名前」の組み合わせで型の所在を検索します。 その結果、異なるアセンブリでまったく同じ名前の型を定義しても、それぞれ別の型として扱われます。 これは、人的ミスの削減や、悪意あるコードへの耐性につながる一方で、 型の定義場所を移動させたいときに困ります。

そこで.NETは、型の検索の際に、別のアセンブリに転送する仕組みを提供しています。 これを型フォワーディング(type forwarding: 型の転送)と呼びます。

サンプル

TypeForwardedTo属性

型フォワーディングには、TypeForwardedTo属性(System.Runtime.CompilerServices)というものを使います。

例えば、ActualLibraryという名前のライブラリがあって、この中に以下のようなクラスが定義されているとします。

public class Class1
{
    public string Name => GetType().Assembly.GetName().Name + " / " + nameof(Class1);
}

このActualLibraryを参照して、以下のような.csファイルを含む、TypeForwardingLibraryという名前のライブラリを作ります。

using System.Runtime.CompilerServices;

[assembly: TypeForwardedTo(typeof(Class1))]

これで、アプリが「TypeForwardingLibraryにあるはずのClass1」を使おうとすると、 実際には「ActualLibraryで定義されたClass1」が返ってきます。

型フォワーディング

これで、例えば、「元々ライブラリAにあった型を、ライブラリBに移した」という場合でも、 AにTypeForwardedTo属性を書いておけば、互換性を崩さずに型を移動できます。

で、型の転送ができて何が嬉しいかというと、主に2通りの用途が考えられます。

  • モジュール分割
  • バックポーティング

更新履歴

ブログ