C# 如何将类型对象用作具体类型?

C# 如何将类型对象用作具体类型?,c#,types,C#,Types,我使用的是一个外部C#库,它将泛型用于其流程。但是我想在外部类中的循环中使用它。我的问题是我不能在类之间传递类型 以下是一个例子: 我使用SettingsXmlReader类读取xml文件的某些部分。这些零件在混凝土等级中规定: SettingsXmlReader settingsXmlReader = new SettingsXmlReader(settingsXmlPath); settingsXmlReader.AddContainer(typeof(ReleasePathContaine

我使用的是一个外部C#库,它将泛型用于其流程。但是我想在外部类中的循环中使用它。我的问题是我不能在类之间传递类型

以下是一个例子:

我使用SettingsXmlReader类读取xml文件的某些部分。这些零件在混凝土等级中规定:

SettingsXmlReader settingsXmlReader = new SettingsXmlReader(settingsXmlPath);
settingsXmlReader.AddContainer(typeof(ReleasePathContainer));
settingsXmlReader.AddContainer(typeof(HistoryPathContainer));
(...)
因此,我将我的具体类型传递给settingsXmlReader对象,但现在,我不能像以下方法那样使用这些类型(因为外部库需要):

我还尝试了以下模式:

SettingsXmlReader settingsXmlReader = new SettingsXmlReader(settingsXmlPath);
settingsXmlReader.AddContainer<ReleasePathContainer>();
settingsXmlReader.AddContainer<HistoryPathContainer>();
SettingsXmlReader SettingsXmlReader=new SettingsXmlReader(settingsXmlPath);
settingsXmlReader.AddContainer();
settingsXmlReader.AddContainer();
但在这种情况下,我不知道如何存储或使用它:

private IList<T> containers;
public void AddContainer<T>()
{
    containers.Add<T>();
}
私有IList容器;
公共void AddContainer()
{
容器。添加();
}

如果您真的需要使用“aContainer”循环,您可以通过使用MakeGenericType来避免变量vs类型错误,如下所示:

Type[] typeArgs = new Type[] { aContainer };

Type genericType = typeof(XmlContainerInitializer<>);
Type specificType = genericListType.MakeGenericType(typeArgs);

// This gets you a XmlContainerInitializer of the right type
var containerInitializer = Activator.CreateInstance(specificType);

// You can then try using it dynamically
dynamic d = containerInitalizer;
IBaseContainer container = (IBaseContainer)d.InitializeXmlContainer(settingsXmlFile);

// Or, if XmlContainerInitializer supports some base interface IContainerInitializer ...
var i = (IContainerInitializer)containerInitializer;
IBaseContainer container = i.InitializeXmlContainer(settingsXmlFile);
Type[]typeArgs=newtype[]{aContainer};
类型genericType=typeof(XmlContainerInitializer);
类型specificType=genericListType.MakeGenericType(typeArgs);
//这将获得正确类型的XmlContainerInitializer
var containerInitializer=Activator.CreateInstance(specificType);
//然后可以尝试动态使用它
动态d=集装箱运输船;
IBaseContainer container=(IBaseContainer)d.InitializeXmlContainer(setingsxmlfile);
//或者,如果XmlContainerInitializer支持一些基本接口IContainerInitializer。。。
变量i=(IContainerInitializer)容器初始化器;
IBaseContainer container=i.InitializeXmlContainer(setingsxmlfile);

您已经有了执行设置xmlreader.AddContainer(typeof(ReleasePathContainer))的代码。如果我像下面那样使用它,
settingsXmlReader.AddContainer(type)
,你就不能这样做吗:
settingsXmlReader.AddContainer(ReleasePathContainer)我从IntelliSense获得以下错误:ReleasePathContainer是一个类型,在给定上下文中无效。与中一样,您的循环是
foreach(容器中的类型aContainer)
。然后你就不能设置xmlreader.AddContainer(一个容器)
typeof(ReleasePathContainer)
返回一个
Type
对象,该对象表示
ReleasePathContainer
类型。您可以执行
Type Type=typeof(ReleasePathContainer);settingsXmlReader.AddContainer(type)
,它的作用与设置sxmlreader.AddContainer(typeof(ReleasePathContainer))完全相同。您可以从泛型转换为
类型
对象(
Type-Type=typeof(T)
),但如果不使用反射,就无法返回到另一种方式。泛型是C#强类型系统的一部分<代码>类型对象不是。感谢您的帮助,现在它运行良好且动态。这就是我想要的。:)
private IList<T> containers;
public void AddContainer<T>()
{
    containers.Add<T>();
}
Type[] typeArgs = new Type[] { aContainer };

Type genericType = typeof(XmlContainerInitializer<>);
Type specificType = genericListType.MakeGenericType(typeArgs);

// This gets you a XmlContainerInitializer of the right type
var containerInitializer = Activator.CreateInstance(specificType);

// You can then try using it dynamically
dynamic d = containerInitalizer;
IBaseContainer container = (IBaseContainer)d.InitializeXmlContainer(settingsXmlFile);

// Or, if XmlContainerInitializer supports some base interface IContainerInitializer ...
var i = (IContainerInitializer)containerInitializer;
IBaseContainer container = i.InitializeXmlContainer(settingsXmlFile);