【问题标题】:Convert object to generic object in C#在 C# 中将对象转换为通用对象
【发布时间】:2016-02-08 08:36:54
【问题描述】:

我有一个通用对象列表:

私有只读列表 _repositories = new List();

这些对象的类型都是“XmlRepository”或“DbRepository”。我还有一个泛型方法,它返回我提供的第一个泛型类型参数存储库:

public IRepository<T> GetRepository<T>() where T : class {...}

我也知道应该返回 XmlRepository 或 DbRepository 的类型参数:

var xmlTypeVar = typeof(XmlType);
var myXmlRepo = GetRepository()

但我不知道如何将其转换为正确类型的对象实例...

var myConvertedXmlRepo = myXmlRepo as XmlRepository???>

我必须在这里做什么?以下是不可能的:

var myConvertedXmlRepo = myXmlRepo as XmlRepository
因为我不允许提供变量作为泛型类型参数... 这里的这个例子有点简单,所以我不可能用专用类型本身替换类型变量(xmlTypeVar)。

非常感谢任何帮助!非常感谢!

【问题讨论】:

  • 在那之后你打算如何处理myConvertedXmlRepo?我的意思是,你为什么需要确切的类型?
  • 我在这里写了一个类似问题的答案(虽然问题更具体一点)Create generic List<T> of T4 generated type
  • @LucasTrzesniewski:我想调用一个特定于 XmlRepository 类型的方法。我该怎么做...?
  • @Chrysokomas 如果没有更多上下文,我不知道最好的方法是什么,但是您可以从抽象的非泛型类 XmlRepository 继承 XmlRepository&lt;T&gt;,然后调用您的方法。
  • @LucasTrzesniewski 这就是解决方案!太感谢了!我怎么没看到... :$ 非常感谢您的帮助!

标签: c# generics type-conversion


【解决方案1】:

在编译时不知道的情况下使用反射创建泛型:

Type genericXmlRepositoryType= typeof(XmlRepository<>);
Type[] typeArgs = new[] { xmlTypeVar };
var generic = genericXmlRepositoryType.MakeGenericType(typeArgs);

如 cmets 中所写,如果您想在创建动态实例后访问 XmlRepository 的方法,最好的办法是创建一个非泛型基类并在那里调用该方法:

XmlRepository repository = (XmlRepository)generic;
repository.UseTypeSpecificMethod();

【讨论】:

  • 非常感谢!我可能必须补充一点,我想在之后使用特定于类型的方法,例如myConvertedXmlRepo.UseTypeSpecificMethod()
  • 太棒了!!非常感谢!!
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2021-03-10
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多