Programátorská hádanka: Doplňte chybějící funkci

Tomáš Herceg       22. 3. 2015       C#       4867 zobrazení

Mám následující app.config:

<configuration>
    <appSettings>
        <add key="Domain" value="google.cz" />
        <add key="Port" value="80" />
        <add key="Name" value="Tomas" />
    </appSettings>
</configuration>

A mám následující program:

var settings = new ApplicationSettings(ConfigurationManager.AppSettings);
Console.WriteLine(settings.Domain);
Console.WriteLine(settings.Port);
Console.WriteLine(settings.Name);

Tento program na konzoli vypíše hodnoty z konfiguračního souboru. Potud jasné.

 

A teď máme třídu ApplicationSettings, která vypadá takto:

 

    public class ApplicationSettings
    {
        private readonly NameValueCollection appSettingsCollection;

        public ApplicationSettings(NameValueCollection appSettingsCollection)
        {
            this.appSettingsCollection = appSettingsCollection;
        }

        // TODO: Sem doplňte funkci GetValue, která vytáhne příslušnou hodnotu z kolekce
        // Tato funkce se ale musí volat bez jakéhokoliv parametru
        

        public string Domain => GetValue();
        public string Port => GetValue();
        public string Name => GetValue();

    }

Jak musí vypadat funkce GetValue, aby to fungovalo správně? Podstatné je, že nesmíte změnit to, jak vypadají vlastnosti Domain, Port a Name - musí i nadále volat tu funkci GetValue bez parametru.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

Odpověď

Optional parametr typu String s CallerMemberName atributem?

nahlásit spamnahlásit spam 4 / 4 odpovědětodpovědět

Správně, přesně tak.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Odpověď...

public string GetValue([CallerMemberName] string callerMemberName = null)
{
    if (String.IsNullOrEmpty(callerMemberName))
        return null;            

    return appSettingsCollection[callerMemberName];
}
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Správně, přesně tak.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takto doufám ne...

Mohlo by to být takto:

public class ApplicationSettings
{
    private readonly NameValueCollection appSettingsCollection;

    public ApplicationSettings(NameValueCollection appSettingsCollection)
    {
        this.appSettingsCollection = appSettingsCollection;
    }

    public string GetValue()
    {
        StackTrace stackTrace = new StackTrace();
        StackFrame[] stackFrames = stackTrace.GetFrames();

        StackFrame callingFrame = stackFrames[1];
        MethodBase method = callingFrame.GetMethod();
        string fullMethodName = method.Name;
        string methodName = fullMethodName.Replace("get_", "").Replace("set_", "");

        return appSettingsCollection[methodName];
    }

    public string Domain
    {
        get
        {
            return this.GetValue();
        }
    }
    public string Port
    {
        get
        {
            return this.GetValue();
        }
    }
    public string Name
    {
        get
        {
            return this.GetValue();
        }
    }
}

Metoda GetValue by se dala vylepšit ještě získáním typu z property a automatickým přetypováním. V každém případě, buď jak buď, jiné řešení mě v rychlosti nenapadá a kdokoli by mi tohle napsal do kódu, tak ho exemplárně popravím před celou firmou :-D

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback