在不知道类型是啥的情况下调用返回泛型集合的泛型方法? C#

Posted

技术标签:

【中文标题】在不知道类型是啥的情况下调用返回泛型集合的泛型方法? C#【英文标题】: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 到你需要的任何东西? (这有点扼杀泛型的概念,但它应该可以工作) 【参考方案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);

【讨论】:

以上是关于在不知道类型是啥的情况下调用返回泛型集合的泛型方法? C#的主要内容,如果未能解决你的问题,请参考以下文章

泛型类的可选方法参数的类型

Java中的泛型理解

JAVA中的泛型类是啥东西?

请教关于java的泛型方法

请教关于java的泛型方法

JAVA中list的泛型问题