检索所有命名空间类型

时间:2013-12-05 16:16:46

标签: c# reflection namespaces

我有一个引用名为“EquipmentDrivers”的命名空间的项目 命名空间包含在实验室中运行Voltmeter / Sourcemeter / NetworkAnalyzer机器的类。 (即:Agilent66XX,Keithley2400)

我想遍历命名空间中的类型列表,以找到与包含类的确切名称的字符串相对应的列表。 (即:string equipmentName =“Keithley2400”,驱动程序是公共类Keithley2400)

我该怎么做?以下是我的第一次尝试:

Type[] NamespaceTypes;
Assembly myAssembly = Assembly.Load("EquipmentDrivers");
NamespaceTypes = myAssembly.ManifestModule.GetTypes();

for (int i = 0; i < NamespaceTypes.Length; i++)
{
 if (NamespaceTypes[i].ToString() == equiptmentName)
 {
      return new NamespaceTypes[i](primaryGPIBAddress, true);
 }
}

好吧,现在我有了这个

public SourceMeter ReturnSourceMeter(string equiptmentName, int primaryGPIBAddress)
{    
Assembly myAssembly = Assembly.LoadFrom("EquipmentDrivers.dll");
var namespacePrefix = "EquipmentDrivers.";
var fullName = namespacePrefix + equiptmentName;
var type = myAssembly.GetType(fullName);
return (SourceMeter)Activator.CreateInstance(type, primaryGPIBAddress, true);

/*
if (equiptmentName == "Keithley2400")
{
return new Keithley2400(primaryGPIBAddress, true);
}
else if (equiptmentName == "Agilent66XX")
{
return new Agilent66XX(primaryGPIBAddress, true);
}
return null;
*/
}

这是对的吗? 顺便感谢一百万人,测试实验室中没有一个人知道如何做到这一点

2 个答案:

答案 0 :(得分:1)

命名空间不是.NET类型系统的一部分。它们是大多数语言提供的便利。存储的名称实际上是完全限定的名称:namespace和class name。

var namespacePrefix = "EquipmentDrivers.";
var fullName = namespacePrefix + equiptmentName;
var type = myAssembly.GetType(fullName);
return Activator.CreateInstance(type, primaryGPIBAddress, true);

您还可以将ReturnSourceMeter方法移动到驱动程序程序集,并在每次添加设备类型时更新它。

答案 1 :(得分:0)

您可以通过以下方式查找类型并创建实例:

Assembly SampleAssembly = Assembly.LoadFrom("your.dll");

var type = SampleAssembly.GetTypes().FirstOrDefault(t => t.Name == "YourTypeName");

var instance = Activator.CreateInstance(type);