Как проверить, является ли строка пространством имен

У меня есть строка, и я хочу проверить, представляет ли она надлежащее пространство имен, например. System.IO в порядке, но System.Lol не.

Я предполагаю, что некоторое отражение должно использоваться, но я не могу понять это.

Какие-либо мысли?

8
задан abatishchev 21 October 2011 в 11:57
поделиться

5 ответов

Ваш вопрос "Как проверить, является ли строка пространством имен" правомерен, только если учесть, где вы проверяете наличие пространств имен.

Пространства имен - это префиксы к именам классов, а классы привязаны к сборке. Чтобы проверить, существует ли пространство имен, вам нужно решить, какие сборки вы готовы просмотреть, чтобы найти существование пространства имен.

После того как вы решили, какие сборки вы готовы просматривать, вы можете перебрать их в поисках существования определенного пространства имен следующим образом:

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;
}
4
ответ дан 5 December 2019 в 14:02
поделиться

Попробуйте следующий подход:

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"
        });
    }
}
8
ответ дан 5 December 2019 в 14:02
поделиться

Вы могли бы это сделать?

Assembly asm = Assembly.GetExecutingAssembly();
List<string> namespaceList = new List<string>();

foreach (Type type in asm.GetTypes())
{
    namespaceList.Add(type.Namespace);
}

Тогда просто проверьте, есть ли строка в списке?

(Предупреждаем, это не проверенный код!)

2
ответ дан 5 December 2019 в 14:02
поделиться

В CLR нет понятия "пространства имен": это не более чем соглашение об именовании. Поэтому не существует API для "перечисления пространств имен" или "получения пространств имен" или даже "получения всех типов в этом пространстве имен".

Лучшее, что можно сделать, это перебрать все загруженные сборки, затем перебрать все экспортируемые типы в каждой из этих сборок и проверить, является ли заданная строка "префиксом" для любого из этих имен типов. Я представляю, что это решение не будет самым быстрым в мире, но и не будет абсолютно неработоспособным.

0
ответ дан 5 December 2019 в 14:02
поделиться

Нет отражения в пространствах имен. Пространства имен определяют полное имя типа. Итак, что вам нужно сделать, это:

  • Перечислить все типы (вы не указываете исходный набор, скажем, .NET Framework, тогда вам нужно включить все сборки .NET по умолчанию (посмотрите на те, на которые ссылается VS при создании проект) или пользовательскую сборку, а затем введите сборку).
  • Найдите свойство Namespace для данного типа

Что вам нужно использовать:

Assembly.Load method

Assembly.GetTypes method

Type.Namespace property

-2
ответ дан 5 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: