我有一个通用的 Repository<T> 类,我想与 ObjectDataSource 一起使用。Repository<T> 位于一个名为 DataAccess 的单独项目中。根据 这篇文章来自 MS 新闻组 (相关部分复制如下):

在内部,ObjectDataSource正在调用type.getType(String)获取类型,因此我们需要遵循type.getType中记录的指南。你可以参考MSDN Library上关于Type.GetType的内容:

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

从文档中,您将了解您需要使用Backtick(`)表示使用仿制药的类型名称。

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

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

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

好吧,有道理。然而,当我尝试时,页面抛出异常:

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

[无效操作异常:找不到 ObjectDataSource“MyDataSource”的 TypeName 属性中指定的类型。]

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

有帮助吗?

解决方案

做这样的事情。

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

获取 assemblyQualifiedName 的值并将其粘贴到 TypeName 字段中。注意Type.GetType(string),传入的值必须是

要获取的类型的程序集限定名称。看 装配合格名称. 。如果该类型位于当前执行的程序集或 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

其他提示

我知道这是一篇旧文章,但我自己最近也遇到了这个问题。另一种解决方案是用对象组合替换继承,例如

[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的“使用字段实现”功能让Resharper进行重构。

达伦,

非常非常感谢您的帖子。我一整天都在为此奋斗。奇怪的是,就我而言,我需要将方括号加倍,例如对于你的代码:

MyProject.Repository`1[[MyProject.MessageCategory,DataAccess,版本=1.0.0.0,文化=中性,PublicKey=null]],DataAccess,版本=1.0.0.0,文化=中性,PublicKey=null

罗杰

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top