#c# #.net-core
Вопрос:
Что у меня есть:
Я объявляю большое количество полей, большинству из которых присваивается собственное имя в качестве строкового значения. Что-то вроде
string ErrorCode0001 = "ErrorCode0001-C";
string ErrorCode0002 = "ErrorCode0002";
string ErrorCode0003 = "ErrorCode0003";
string ErrorCode0004 = "ErrorCode0004";
string ErrorCode0005 = "ErrorCode0005";
string ErrorCode0006 = "ErrorCode0001";
Теперь, если вы обратите внимание на приведенный выше код , в котором я допустил ошибку ErrorCode0006
, которую трудно заметить.
Ошибка выше произошла из-за того, что я скопировал объявление первого поля, а затем просто изменил номер суффикса, пропустив его в последнем поле.
То, что я хотел бы иметь:
Я бы с удовольствием написал что-нибудь вроде
string ErrorCode0001 = $"{nameof(self)}-C";
string ErrorCode0002 = $"{nameof(self)}";
string ErrorCode0003 = $"{nameof(self)}";
string ErrorCode0004 = $"{nameof(self)}";
string ErrorCode0005 = $"{nameof(self)}";
string ErrorCode0006 = $"{nameof(self)}";
но я не уверен, как это сделать в C#.
Хотелось бы увидеть здесь несколько умных предложений.
Ответ №1:
Одним из способов достижения этой цели было бы использование атрибута CallerMemberName.
Для этого вы определяете такой метод, как:
private static String GetName([CallerMemberName] string fieldName = "")
=> fieldName;
который при вызове без параметров вернет имя вызывающего участника (поле в вашем случае!).
Ты используешь его как:
public static readonly string KPT1_0001 = $"{GetName()}-C";
public static readonly string KPT1_0002 = $"{GetName()}";
public static readonly string KPT1_0003 = $"{GetName()}";
public static readonly string KPT1_0004 = $"{GetName()}";
public static readonly string KPT1_0005 = $"{GetName()}";
public static readonly string KPT1_0006 = $"{GetName()}";
private static String GetName([CallerMemberName] string fieldName = "")
=> fieldName;