2008-09-09 60 views
9

我有一个通用的存储库<T>我想与ObjectDataSource一起使用的类。存储库<T>位于名为DataAccess的单独项目中。据this post from the MS newsgroups(以下复制相关部分):在ObjectDataSource中使用泛型类

内部,ObjectDataSource控件在调用Type.GetType(字符串),以获得 类型,所以我们需要遵循怎样 在Type.GetType记录的方针使用泛型获取类型。您可以参考MSDN库上Type.GetType:

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

从文件,你会知道你需要使用反引号(`)来 表示这是使用泛型类型名称。

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

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

类型名= “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()也会返回有效类型。那么是什么给了?

回答

13

做这样的事情。

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

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

类型的程序集限定名称来获得。见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); %> – 2012-08-23 09:20:34

0

达伦,

很多,非常感谢您的文章。我一整天都在为此而战。奇怪的是,就我而言,我需要加倍方括号,例如你的一段代码:

MyProject.Repository`1 [[MyProject.MessageCategory,DataAccess,Version = 1.0.0.0,Culture = neutral,PublicKey = null]],DataAccess,Version = 1.0.0.0,Culture = neutral ,公钥= 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和接口,则可能使Resharper使用Resharpers“Implement using field”功能执行重构。