Και αμέσως μετά μου ήρθε, άλλος ένας "περίεργος" τρόπος, για να κάνεις αυτό που κάνει το CSLA στην PropertyHasChanged. Η PropertyHasChanged έχει δύο εκδόσεις, μία η οποία δέχεται σαν παράμετρο το όνομα του property και μία με το StackTrace που κάνει όλη αυτή τη μανούβρα για να βρει το όνομα του property μέσω της StackTrace και να καλέσει μετά την πρώτη εκδοχή. Βέβαια, πάλι θα πρέπει κανείς να πάει σε όλα τα property set και να γράψει PropertyHasChanged(), οπότε το μόνο που κερδίζει κανείς είναι ότι μπορεί να κάνει copy/paste αυτή τη γραμμή.
Κάτι παρόμοιο μπορεί να πετύχει κανείς με την MethodBase.GetCurrentMethod().Name η οποία επιστρέφει το όνομα της τρέχουσας μεθόδου. Έτσι η PropertyHasChanged γίνεται PropertyHasChanged(MethodBase.GetCurrentMethod().Name) . Πετυχαίνει το ίδιο αποτέλεσμα με καλύτερες (όχι όμως καλές) επιδόσεις και παίζει και το copy/paste.
Υ.Γ. Ο κώδικας της PropertyHasChanged είναι ...
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
[Obsolete("Use overload requiring explicit property name")]
protected void PropertyHasChanged()
{
string propertyName = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().Name.Substring(4);
PropertyHasChanged(propertyName);
}
οπότε μάλλον το καταλάβανε ότι η ιδέα ήταν κακή.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos