2008-09-09 11 views
9

汎用リポジトリ<T>クラスObjectDataSourceで使用したいクラスです。リポジトリ<T>は、DataAccessという別のプロジェクトに存在します。 this post from the MS newsgroups(関連部分は以下のコピー)によると:ObjectDataSourceでの汎用クラスの使用

内部的には、ObjectDataSourceのは タイプを取得するために、Type.GetType(文字列)を呼び出しているので、私たちはどのように の上Type.GetTypeに文書化ガイドラインに従う必要がありますgenericsを使用して型を取得します。あなたは に( `)バッククォートを使用する必要があることを学びます、ドキュメントから

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

をジェネリックを使用しているタイプの名前を表し:あなたはType.GetType上のMSDNライブラリを参照することができます。

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

型名

オーケー= "TestObjectDataSourceAssembly.MyDataHandler`1 [可能System.String]、TestObjectDataSourceAssemblyを" 理にかなって:

だから、あなたの質問には、答えは次のようにタイプ名を使用することです。私はそれをしようとすると、しかし、ページが例外をスロー:

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

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

好奇心の強いことは、これがページを表示しているときにのみ発生するということです。 VS2008デザイナーから「データソースの設定」ダイアログを開くと、ジェネリックリポジトリクラスのメソッドが正しく表示されます。 TypeName文字列をType.GetType()に渡すと、デバッグ中にも有効な型が返されます。だから何を与える?

答えて

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 
+0

<%Response.Write(typeof(YourClassName).AssemblyQualifiedName); %> –

0

ダレン、あなたのポストのための

多く、多くのおかげです。私は一日中これと戦ってきました。不思議なことに、私の場合、角括弧を二重にする必要があります。

MyProject.Repository`1 [[MyProject.MessageCategory、DataAccess、Version = 1.0.0.0、Culture = neutral、PublicKey = null]]、DataAccess、Version = 1.0.0.0、Culture =ニュートラル、のPublicKey = nullを

ロジャー

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とインターフェイスを使用している場合、Resharpersが "フィールドを使用して実装する"機能を使用して、Resharperにリファクタリングを実行させることが可能です。

関連する問題