У меня есть строка, и я хочу проверить, представляет ли она надлежащее пространство имен, например. System.IO
в порядке, но System.Lol
не.
Я предполагаю, что некоторое отражение должно использоваться, но я не могу понять это.
Какие-либо мысли?
Ваш вопрос "Как проверить, является ли строка пространством имен" правомерен, только если учесть, где вы проверяете наличие пространств имен.
Пространства имен - это префиксы к именам классов, а классы привязаны к сборке. Чтобы проверить, существует ли пространство имен, вам нужно решить, какие сборки вы готовы просмотреть, чтобы найти существование пространства имен.
После того как вы решили, какие сборки вы готовы просматривать, вы можете перебрать их в поисках существования определенного пространства имен следующим образом:
public bool NamespaceExists(IEnumerable<Assembly> assemblies, string ns)
{
foreach(Assembly assembly in assemblies)
{
if(assembly.GetTypes().Any(type => type.Namespace == ns))
return true;
}
return false;
}
Попробуйте следующий подход:
using System.CodeDom.Compiler;
using System.Linq;
class NamespaceTester : IDisposable
{
private CodeDomProvider provider = CodeDomProvider.CreateProvider("c#");
private CompilerParameters settings = new CompilerParameters();
private CompilerResults results;
public bool Test(string[] namespaces)
{
results = provider.CompileAssemblyFromSource(
settings,
namespaces.Select(n => String.Format("using {0};", n)).ToArray());
return results.Errors
.OfType<CompilerError>()
.Any(e => String.Equals(
e.ErrorText,
"CS0234",
StringComparison.Ordinal));
}
public void Dispose()
{
if (results != null)
{
System.IO.File.Delete(results.CompiledAssembly.Location);
}
}
}
где CS0234
:
Тип или имя пространства имен 'name' не существует в классе или пространстве имен 'scope' (вам не хватает ссылки на сборку ?)
Добавление пользовательских ссылок:
settings.ReferencedAssemblies.Add("Foobar.dll")
Использование:
public static void Main(string[] args)
{
using (var tester = new NamespaceTester())
{
var success = tester.Test(new[] {
"System.IO",
"System.LOL"
});
}
}
Вы могли бы это сделать?
Assembly asm = Assembly.GetExecutingAssembly();
List<string> namespaceList = new List<string>();
foreach (Type type in asm.GetTypes())
{
namespaceList.Add(type.Namespace);
}
Тогда просто проверьте, есть ли строка в списке?
(Предупреждаем, это не проверенный код!)
В CLR нет понятия "пространства имен": это не более чем соглашение об именовании. Поэтому не существует API для "перечисления пространств имен" или "получения пространств имен" или даже "получения всех типов в этом пространстве имен".
Лучшее, что можно сделать, это перебрать все загруженные сборки, затем перебрать все экспортируемые типы в каждой из этих сборок и проверить, является ли заданная строка "префиксом" для любого из этих имен типов. Я представляю, что это решение не будет самым быстрым в мире, но и не будет абсолютно неработоспособным.
Нет отражения в пространствах имен. Пространства имен определяют полное имя типа. Итак, что вам нужно сделать, это:
Что вам нужно использовать: