在C#中将对象转换为通用对象

时间:2016-02-08 08:36:55

标签: c# generics type-conversion

我有一个通用对象列表:

private readonly List<object> _repositories = new List<object>();

这些对象的类型都是&#34; XmlRepository&lt; T&gt;&#34;或&#34; DbRepository&lt; T&gt;&#34;。我还有一个通用的方法,它返回我提供的泛型类型参数的第一个存储库:

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

我也知道什么类型的参数应该返回XmlRepository&lt; T&gt;或DbRepository&lt; T&gt;:

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

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

var myConvertedXmlRepo = myXmlRepo as XmlRepository<???>

我该怎么办?以下是不可能的:

var myConvertedXmlRepo = myXmlRepo as XmlRepository<xmlTypeVar>
因为我不允许将变量作为泛型类型参数提供... 这个例子在某种程度上是简单的,所以我不可能用专用的Type本身替换类型变量(xmlTypeVar)。

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

1 个答案:

答案 0 :(得分:0)

使用反射在不知道编译时创建泛型类型:

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

如评论中所述,如果您想访问XmlRepository方法&lt;&gt;在创建动态实例之后,最好的想法是创建一个非泛型基类并在那里调用该方法:

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