2013-12-05 4 views
0

У меня есть проект, который ссылается на пространство имен, называемое «EquipmentDrivers» , пространство имен содержит классы, которые запускают машины Voltmeter/Sourcemeter/NetworkAnalyzer в лаборатории. (Ie: Agilent66XX, Keithley2400)Извлечение всех пространств имен Типы

Я хотел бы перебирать список типов в пространстве имен, чтобы найти тот, который соответствует строке, которая содержит точное имя класса. (например: струнное оборудованиеName = «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

И что случилось с этой первой попыткой? AKA, какова ваша конкретная проблема. SO, это не место, чтобы заставить людей делать всю работу за вас. –

+1

Ответ прост, но возникновение вопроса меня смущает. Зачем вам это нужно? Есть лучшие способы, пожалуйста, мотивируйте, почему делать это «как это» - лучший способ? – flindeberg

+0

Если [ответ Джеффри] (http://stackoverflow.com/a/20408737/80274) был правильным, обязательно отметьте его, чтобы он получил кредит. –

ответ

0

Вы можете искать тип и создать экземпляр из него таким образом:

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

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

var instance = Activator.CreateInstance(type); 
+0

Контекст моего вопроса в этом. Не все SourceMeters являются Keithley SourceMeters. Процедура тестирования должна быть достаточно общей, чтобы позволить создателю файла шаблона изменить строку, которая говорит «Keithley2400», на «Agilent66XX». – Rwsselby

+0

Метод, который у меня есть, является условным и, следовательно, если новая порция equiptment добавляется программа не несовместим – Rwsselby

+0

'общественного SourceMeter ReturnSourceMeter (строка equiptmentName, внутр primaryGPIBAddress) { если (equiptmentName == "Keithley2400") { вернуть новый Keithley2400 (primaryGPIBAddress, истинный); } else if (equiptmentName == "Agilent66XX") { возвращение нового Agilent66XX (primaryGPIBAddress, true); } null null; } ' – Rwsselby

1

Пространства имен а не частью системы типа .NET. Это удобство, предлагаемое большинством языков. Имя, которое хранится, фактически является полным именем: namespace и именем класса.

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

Вы также можете переместить метод ReturnSourceMeter драйверов сборки и обновлять его каждый раз, когда добавляется тип устройства.

Смежные вопросы