9

ObjectDataSource で使用したい汎用の Repository<T> クラスがあります。Repository<T> は、DataAccess という別のプロジェクトにあります。MS ニュースグループのこの投稿によると(関連部分を以下にコピー):

内部的に、ObjectDataSource は Type.GetType(string) を呼び出して型を取得しているため、ジェネリックを使用して型を取得する方法については、Type.GetType に記載されているガイドラインに従う必要があります。Type.GetType で MSDN ライブラリを参照できます。

http://msdn2.microsoft.com/en-us/library/w3f99sx1.aspx

このドキュメントから、ジェネリックを使用している型名を示すためにバッククォート (`) を使用する必要があることがわかります。

また、ここでは型名文字列でアセンブリ名を指定する必要があります。

したがって、あなたの質問に対する答えは、次のような型名を使用することです。

TypeName="TestObjectDataSourceAssembly.MyDataHandler`1[System.String],TestObjectDataSourceAssembly"

わかりました。ただし、試してみると、ページで例外がスローされます。

<asp:ObjectDataSource ID="MyDataSource" TypeName="MyProject.Repository`1[MyProject.MessageCategory],DataAccess" />

[InvalidOperationException: ObjectDataSource 'MyDataSource' の TypeName プロパティで指定された型が見つかりませんでした。]

興味深いことに、これはページを表示しているときにのみ発生します。VS2008 デザイナーから [データ ソースの構成] ダイアログを開くと、汎用リポジトリ クラスのメソッドが適切に表示されます。デバッグ中に TypeName 文字列を Type.GetType() に渡すと、有効な型も返されます。それで、何が得られますか?

4

3 に答える 3

13

このようなことをしてください。

Type type = typeof(Repository<MessageCategory);
string assemblyQualifiedName = type.AssemblyQualifiedName;

assemblyQualifiedNameの値を取得し、それをTypeNameフィールドに貼り付けます。Type.GetType(string)に注意してください。渡される値は、

取得するタイプのアセンブリ修飾名。AssemblyQualifiedNameを参照してください。タイプが現在実行中のアセンブリまたはMscorlib.dllにある場合は、名前空間で修飾されたタイプ名を指定するだけで十分です。

そのため、そのクラスは現在実行中のアセンブリ(呼び出し元)にあるのに対し、ObjectDataSourceにはないため、コードでその文字列を渡すことで機能する可能性があります。

おそらくあなたが探しているタイプは

MyProject.Repository`1[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null
于 2008-09-09T23:08:12.020 に答える
1

これは古い投稿であることは知っていますが、最近この問題が発生しました。別の解決策は、継承をオブジェクト合成に置き換えることです。

[DataObject]
public class DataAccessObject {
    private Repository<MessageCategory> _repository;

    // ctor omitted for clarity
    // ...

    [DataObjectMethod(DataObjectMethodType.Select)]
    public MessageCategory Get(int key) {
        return _repository.Get(key);
    }
}

このように、ObjectDataSource はクラス内に隠されているため、リポジトリについて認識しません。取り組んでいるプロジェクトにこのコードを配置するのに完全に合理的な場所である、ファサード レイヤーにクラス ライブラリがあります。

さらに、Resharper とインターフェースを使用している場合は、Resharper の「Implement using field」機能を使用して、Resharper にリファクタリングを実行させることができます。

于 2014-10-21T16:58:03.067 に答える
0

ダレン、

投稿ありがとうございます。私は一日中これと戦ってきました。奇妙なことに、私の場合、たとえばコードの一部について、角かっこを2つにする必要があります。

MyProject.Repository`1[[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null]], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null

ロジャー

于 2009-09-30T17:45:22.570 に答える