Caller Information v .NET 4.5

Zatím jsem se příliš nezajímal o novinky v .NET 4.5. Nainstaloval jsem si ale Visual Studio 2012 RC a když už ho tu mám, začal jsem v něm psát jednu malou aplikaci pro mou vlastní potřebu. A náhodou jsem narazil na novou funkci, o kterou se musím podělit.

.NET 4.5 přináší tři nové atributy, pomocí kterých můžete získat informace o kódu, který zavolal aktuální metodu. Jednoduše deklarujete nepovinný parameter vhodného typu, přidáte jeden z těchto atributů a běhové prostředí se postará o vyplnění hodnoty.

Jde o tyto atributy:

CallerFilePathAttribute – jméno zdrojového souboru s cestou
CallerLineNumberAttribute – číslo řádku
CallerMemberNameAttribute – jméno volajícího člena (metody, vlastnosti  apod.)

Použití pak vypadá například takto:

void Test([CallerLineNumber] lineNumber = 0) {}

To může být užitečné pro diagnostiku, logování a podobně, ale existuje i jiný, velmi častý scénář, kdy se toto hodí (a jak jsem na to narazil já).

Implementace rozhraní INotifyPropertyChanged (používané pro data binding ve Windows Forms a WPF) ve starších verzích .NET frameworku vyžaduje parametr s názvem změněné vlastnosti:

// Deklarace
private void NotifyPropertyChanged(string propertyName) {}
 
// Použití
public string Name
{
    set
    {
        if (name != value)
        {
            name = value;
            NotifyPropertyChanged("Name");
        }
    }
}

Název vlastnosti je při volání uveden jako text, takže samozřejmě není kontrolován kompilátorem a snadno dojde k nějaké chybě.

Existují i alternativní implementace – například lze s trochou snahy specifikovat vlastnost pomocí lambda výrazu (viz zde). Nicméně implementace pomocí CallerMemberNameAttribute v .NET 4.5 je zcela přímočará:

private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") {}
 
public string Name
{
    set
    {
        if (name != value)
        {
            name = value;
            NotifyPropertyChanged();
        }
    }
}

Je to celé popsáno na MSDN, takže podrobnosti si snadno najdete. Jen musíte vědět, že něco takového vůbec existuje.