使用ObjectDataSource的泛型类

时间:2008-09-09 21:43:55

标签: asp.net generics objectdatasource

我有一个通用的存储库< T> class我想用ObjectDataSource。储存库< T>住在一个名为DataAccess的独立项目中。根据{{​​3}}(以下复制的相关部分):

  

在内部,ObjectDataSource正在调用Type.GetType(string)来获取   类型,所以我们需要遵循Type.GetType中记录的指南   使用泛型获取类型。您可以参考Type.GetType:

上的MSDN Library      

this post from the MS newsgroups

     

从文档中,您将了解到需要使用反引号(`)   表示使用泛型的类型名称。

     

此外,这里我们必须在类型名称字符串中指定程序集名称。

     

因此,对于您的问题,答案是使用类型名称,如下所示:

     

类型名= “TestObjectDataSourceAssembly.MyDataHandler`1 [System.String],TestObjectDataSourceAssembly”

好的,有道理。但是,当我尝试它时,该页面会抛出异常:

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

[InvalidOperationException:找不到ObjectDataSource'MyDataSource'的TypeName属性中指定的类型。]

奇怪的是,这只会在我查看页面时发生。当我从VS2008设计器打开“配置数据源”对话框时,它正确地向我显示了我的通用Repository类的方法。调试时将TypeName字符串传递给Type.GetType()也会返回有效类型。那是什么给出了什么?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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就不知道存储库,因为它隐藏在类中。我的Facade层中有一个类库,这是将这段代码放在我正在处理的项目中的完美合理的地方。

此外,如果您正在使用Resharper和接口,则可以使Resharper使用Resharpers&#34;使用字段&#34;来实现重构。功能

答案 2 :(得分:0)

的Darren,

很多,非常感谢您的帖子。我整天都在和这个人打架。奇怪的是,在我的情况下,我需要加倍方括号,例如为你的代码:

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

罗杰