将泛型类与 ObjectDataSource 一起使用
-
09-06-2019 - |
题
我有一个通用的 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
罗杰