【问题标题】:Invoking a generic method that returns a collection of generics without knowing what the type is? C#在不知道类型是什么的情况下调用返回泛型集合的泛型方法? C#
【发布时间】:2010-12-08 02:13:54
【问题描述】:

我只是在玩用 C# 编写一个 ORM 类型的项目。

基本上,我有一个这样的类结构:

IDBO操作 --- DBReadOperation

DBOperationPool

基本上,DBReadOperation 将数据从指定的数据库表映射到我的解决方案中的一个类,例如 PersonDetails。

执行此操作的代码取自外部源(不太记得?),并且基本上返回一个通用集合(Collection)。

我的 DBOperationPool 需要能够获取任意数量的 DBReadOperation 并为每个返回结果。我的逻辑已经失败..但似乎无法让代码工作?

映射类也是基于泛型构建的。所以我怎样才能将映射类实例化为...

MappingClass<?> mappingInstance = new MappingClass<?>();
Collection<?> returnedCollection = mappingInstance.MapData(argument);

我如何(使用泛型、反射或任何东西)找出在上面问号的位置放置什么?可以做到吗?我进行了搜索,似乎与这个确切的问题没有任何关系..

显然,简单的方法是让池包含我想要映射的类型。但池的全部意义在于我可以将 DBReadOperation 扔给它,比如 PersonDetails、CompanyDetails 等,并拥有数据映射到它需要的位置,并为每种类型正确返回结果。通过这条路线,我可以将任意数量的 DBReadOperations 放入一个池中,只要它们处理每个 DBOperationPool 实例的特定类型..但这不是我想要的..

这有意义吗?

问候,

西蒙

【问题讨论】:

  • 也许使用 object 作为泛型类型参数,然后 casxting 到你需要的任何东西? (这有点扼杀泛型的概念,但它应该可以工作)

标签: c# sql generics reflection orm


【解决方案1】:

让 MappingClass 实现一些接口 IMappingClass,然后在你不知道泛型将持有什么类型的任何地方引用它。

public interface IMappingClass {
   public void DoStuff();
}

public class MappingClass<T> : IMappingClass {
   // stuff
}

// ... elsewhere ...

public void DoMappingStuff(IMappingClass map){
   map.DoStuff();
   // do other stuff...
}

// ...

MappingClass<string> myStringMap = new MappingClass<string>();
DoMappingStuff(myStringMap);

MappingClass<int> myIntMap = new MappingClass<int>();
DoMappingStuff(myIntMap);

【讨论】:

  • 这两个选项都不能真正解决我的问题 -> 那是我的错,我解释得很糟糕..
  • 哎呀,没有意识到输入提交您的评论!无论如何,我基本上尝试使用动态关键字来解决问题..但它抛出了一个“不包含定义”错误..这就是我正在尝试的..
    var mapper = operation.Value.GetPropertyMapper(); AddResult(operation.Key, mapper.MapAll(DbReader));
    GetPropertyMapper 返回一个 PropertyMapper 对象,该对象肯定包含 MapAll 方法..为什么会抛出错误?
【解决方案2】:

您的 DBReadOperation 类可以是通用的吗?意思是,DBReadOperation&lt;T&gt; 然后你实例化它:

var dbReadOperation = new DBReadOperation<PersonDetails>();

MappingClass 将接受一个 DBReadOperation 并返回一个 T。它可以像这样使用:

var mapper = new MappingClass<DBReadOperation<PersonDetails>>();
Collection<PersonDetails> collection = mapper.MapData(someArgument);

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多