我有一个引用名为“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;
*/
}
这是对的吗? 顺便感谢一百万人,测试实验室中没有一个人知道如何做到这一点
答案 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);