我有一个通用对象列表:
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)。
非常感谢任何帮助!非常感谢你!
答案 0 :(得分:0)
使用反射在不知道编译时创建泛型类型:
Type genericXmlRepositoryType= typeof(XmlRepository<>);
Type[] typeArgs = new[] { xmlTypeVar };
var generic = genericXmlRepositoryType.MakeGenericType(typeArgs);
如评论中所述,如果您想访问XmlRepository方法&lt;&gt;在创建动态实例之后,最好的想法是创建一个非泛型基类并在那里调用该方法:
XmlRepository repository = (XmlRepository)generic;
repository.UseTypeSpecificMethod();