2

更新:私の「問題」は、リフレクションを使用していたクラスについての悪い仮定によるものでした。以下の私の質問は無意味です。ただし、コード スニペットが役立つ場合に備えて、ここに残しておきます。

リフレクションを使用して、のアセンブリに存在するコンパイル済みクラスからビューモデルを生成しています。コンパイルされたアセンブリから返された型が、インターフェイスの具体的な実装であるクラスではなくインターフェイスを示していることを除いて、ほとんどすべてが機能しています。

たとえば、コンパイルされたアセンブリでは、次のようなプロパティを定義します。

    public List<String> strings { get; set; }

リフレクションを使用して、次のような対応するプロパティ (および完全なクラス) を生成できました。

    public ICollection<String> strings { get; set; }

これを行うタイプを取得します(簡潔にするために大幅に省略されています):

    Type value = <...some passed in type...>
    String types = String.Join(",", value.GetGenericArguments().Select(t => t.Name).ToArray());

    String.Format("{0}<{1}>", value.GetGenericTypeDefinition(), types);

Type オブジェクトを使用して、返されたインターフェイスに使用された具体的な実装を特定する方法はありますか? いいえと思いますが、尋ねると思いました。

方法がない場合、より良い提案がない限り、特定のインターフェイスに対して「最も可能性の高い実装」ルックアップを使用することを考えています (つまり、「ICollection」を渡します。それを具体的な「リスト」に変換します)。 ??

これは、T4 テンプレートを使用してコントローラー、ビュー、およびビューモデル (オートマッパーと Kendo UI を使用) を生成するために使用されるため、「完璧な」ソリューションは必ずしも必要ではありません。したがって、クリーンアップするものがいくつかある場合は、それで問題ありません。したがって、私を近づける提案は大歓迎です。

4

1 に答える 1

0

さて、私はリフレクションで少し遊んで、ここに私が持ってきたものがあります:

    //Initial list with ints
    var items = new List<int> {1, 2, 3, 4, 5};
    //ICollection<int> reference
    var collectionOfItems = (ICollection<int>) items;

    //...

    //First of, get collection Type object
    var collectionType = collectionOfItems.GetType();
    //Next, let's grab generic arguments
    var genericArguments = collectionType.GetGenericArguments();

    //For each generic candidate type we need to construct it with collection's generic arguments
    var candidate = typeof(List<>).MakeGenericType(genericArguments);

    //Perform check
    if (collectionType.IsAssignableFrom(candidate))
        Console.WriteLine("Can be casted to {0}", candidate);
    else
        Console.WriteLine("Cannot be cated to {0}", candidate);

はい、リフレクションで可能ですが、多くの可能なタイプに対してチェックする必要があります (BCL タイプではないものも実装できますICollection)。具体的な型でプロパティを宣言する方が良い

于 2013-04-16T07:29:21.070 に答える