我有一个通用的存储库< T> class我想用ObjectDataSource。储存库< T>住在一个名为DataAccess的独立项目中。根据{{3}}(以下复制的相关部分):
在内部,ObjectDataSource正在调用Type.GetType(string)来获取 类型,所以我们需要遵循Type.GetType中记录的指南 使用泛型获取类型。您可以参考Type.GetType:
上的MSDN Librarythis 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()也会返回有效类型。那是什么给出了什么?
答案 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
罗杰