Come posso identificare uno spazio dei nomi senza usare una stringa letterale?

3

La mia squadra ha molte convenzioni IOC che assomigliano a ...

if (type.Namespace == "My.Fun.Namespace")
{
    // do stuff
}

Naturalmente, mantenere questo genere di cose diventa brutale dopo un po ', e preferiremmo non farlo. L'unica opzione che potevo pensare era di archiviarli tutti in un posto, come costanti di stringa o qualcosa di quella natura, ma non è molto meglio ... Abbiamo preso in considerazione l'idea di creare classi che servono fondamentalmente come identificatori di spazio dei nomi in ordine avere quasi un tipo di ancora da escludere, come, per esempio ...

if (type.Namespace == typeof(My.Fun.Namespace.MarkerClass).Namespace)
{
    // do stuff
}

Ma questo sembra strano. Quindi c'è un altro modo per risolvere questo problema di cui non sappiamo nulla? In caso contrario, qualcuno ha avuto fortuna con l'intero concetto di classe dei marcatori?

    
posta archer884 30.04.2014 - 00:37
fonte

1 risposta

1

Penso che il tuo secondo approccio sia la soluzione migliore. Tuttavia, capisco che sembra weired per accedere allo spazio dei nomi utilizzando un'altra classe come riferimento. Forse puoi mantenere un singolo file con molti spazi dei nomi contenenti solo una singola interfaccia.

namespace My.Fun.NameSpace
{
    interface IContract { }
}
namespace My.Other.NameSpace
{
    interface IContract { }
}

utilizzo:

if (type.Namespace == typeof(My.Fun.Namespace.IContract).Namespace)
{
    // do stuff
}

Un'altra opzione che potrei pensare è un metodo di estensione

namespace System
{
    public static class TypeExtension
    {
        public static bool IsFromFunNameSpace(this Type type)
        {
             return IsFromNameSpace(type, typeof(My.Fun.NameSpace.IContract));
        }

        public static bool IsFromOtherNameSpace(this Type type)
        {
            return IsFromNameSpace(type, typeof(My.Other.NameSpace.IContract));
        }

        private bool IsFromNameSpace(Type type, Type contract)
        {
            type.Namespace == contract.NameSpace;
        }
    }
}

utilizzo:

if (type.IsFromFunNameSpace())
{
    // do stuff
}

In ogni caso, il tuo approccio al CIO mi sembra estenuante. La soluzione definitiva (che richiede di avere accesso al codice sorgente) dovrebbe semplicemente consentire a una classe di implementare un'interfaccia (che può essere vuota)

public interface IFun { }

public class FunnyClass : IFun { }

utilizzo:

if (typeof(IFun).IsAssignableFrom(type))
{
    // do stuff
}

Ora non sei limitato a uno spazio dei nomi specifico

    
risposta data 09.05.2014 - 09:55
fonte

Leggi altre domande sui tag