代码之家  ›  专栏  ›  技术社区  ›  Brant Bobby

将泛型类与ObjectDataSource一起使用

  •  9
  • Brant Bobby  · 技术社区  · 16 年前

    我有一个通用的存储库<t>类,我想与ObjectDatasource一起使用。存储库<t>位于一个名为dataaccess的单独项目中。根据 this post from the MS newsgroups (相关部分复制如下):

    在内部,ObjectDataSource正在调用Type.GetType(String)以获取 类型,因此我们需要遵循type.gettype中记录的关于如何 使用泛型获取类型。您可以参考type.gettype上的msdn库:

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

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

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

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

    typename=“测试对象数据源程序集.mydatahandler`1[系统.string],测试对象数据源程序集”

    好吧,说得通。但是,当我尝试时,页面抛出一个异常:

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

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

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

    3 回复  |  直到 10 年前
        1
  •  13
  •   Darren Kopp    16 年前

    像这样做。

    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
    
        2
  •  1
  •   Philip Johnson    10 年前

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

    [DataObject]
    public class DataAccessObject {
        private Repository<MessageCategory> _repository;
    
        // ctor omitted for clarity
        // ...
    
        [DataObjectMethod(DataObjectMethodType.Select)]
        public MessageCategory Get(int key) {
            return _repository.Get(key);
        }
    }
    

    这样,对象数据源就不知道存储库的情况,因为它隐藏在类中。我的Facade层中有一个类库,它是一个非常合理的地方,可以将这些代码放到我正在处理的项目中。

    此外,如果您使用的是resharper和接口,则可以使用resharper“implement using field”函数让resharper执行重构。

        3
  •  0
  •   roger    15 年前

    戴伦

    非常感谢你的职位。我一整天都在和这个打架。奇怪的是,在我的例子中,我需要将方括号加倍,例如,对于您的代码:

    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

    罗杰