In code at work, we have many uses of magic strings like the following code snippet:
if (user.HasRight("Profile.View")) {...}
So there are many places where we pass a string as a parameter to see if the user has a specific right. I don't like that because that generates a lot of magic strings.
What would be a better way of doing it?
Enum, Constant, class ?
Extension methods! Keep them in the same place to keep track of all magic strings.
Then you can:
Create a class which strongly-types those properties, like
This will keep your "magic strings" in one place within your code. An enum will also work, but isn't as readable in my opinion.
Note: my example is intended to act as a property proxy for the logged in user, thus the static class. If you wanted something that would work on more immediate data (say, a list of users), this type of class would need to be non-static and instantiated on per-user-account basis.
In that specific case, use an Enum. There will be no magic strings and if the Enum changes (in a way that would break the magic strings solution), the app will no longer compile.
Then you can simply have:
You could also use a class, but then you limit yourself when it comes to more complex scenarios. For instance, a simple change of the Enumeration to something like:
Would allow you to use bitwise operators for more complex permissions (for example, a situation where a user needs either Create or Delete):
You can do constant strings in C#.
You could define all of the strings in a header like this:
Not sure if this is the "best" way, but its certainly better than having magic values in the code.
I second the way shown by "Justin Niessner". But in some cases I would rather prefer writing following construct of code.
and you can consume it as
This is common enough in the .NET framework as well. Examples are System.Windows.DataFormats and System.Net.WebRequestMethods.Http. You'd want the readonly variety: