我有一個這樣的課程:
public class DbSettingsValues : Dictionary<string, string>
{
public DbSettingsValues() { }
public DbSettingsValues(Dictionary<string, string> values) : base(values) { }
public string EmailApiServer
{
get => this.GetValueOrDefault(DbSettingsKeys.EmailApiServer, "");
set => this[DbSettingsKeys.EmailApiServer] = value;
}
public string EmailApiKey
{
get => this.GetValueOrDefault(DbSettingsKeys.EmailApiKey, "");
set => this[DbSettingsKeys.EmailApiKey] = value;
}
// about 15 more...
// There is also a few difference, like this one:
public int RegisterFirstEmailDelay
{
get => int.Parse(this.GetValueOrDefault(DbSettingsKeys.RegisterFirstEmailDelay, "24"));
set => this[DbSettingsKeys.RegisterFirstEmailDelay] = value.ToString();
}
}
因此,對于每個屬性,我需要輸入 3 次確切名稱。我知道這對以后的維護不利,并且當我通過復制創建更多屬性時容易出錯(即忘記替換 3 個位置中的 1 個中的名稱)。
有沒有更好的方法來處理這個問題?我想到了一些解決方案:
類似于舊的 T4,我在 VS2022 中看不到 T4 選單了,所以我認為它在 .NET Core 上不起作用?
代碼生成器似乎需要一個外部專案。我認為這就是 EF Core Scaffolding 的作業原理?有人可以建議我應該尋找的關鍵字/鏈接嗎?即讀取 C# 專案,在類中查找屬性并相應地生成
.cs檔案?
根據當前的規范,關鍵文本是一樣的:
public const string EmailApiServer = nameof(EmailApiServer);
public const string EmailApiKey = nameof(EmailApiKey);
// ...
因此從技術上講,我可以只需更換DbSettingsKeys.EmailApiServer到nameof(EmailApiServer)的例子,但我不知道它會保持不變后。現在繼續這樣做并稍后在規格更改時考慮它是否是個好主意?
更新:我剛剛意識到即使使用nameof(PropertyName),它仍然容易出現復制問題,因為如果我忘記更改名稱就不會出錯:
// No error here because the name is valid
public string EmailApiKey
{
get => this.GetValueOrDefault(nameof(EmailApiServer), "");
set => this[nameof(EmailApiServer)] = value;
}
我認為類似的東西CallerMemberNameAttribute可能有用,但我實際上不知道它是如何作業的。
uj5u.com熱心網友回復:
如果鍵確實與屬性具有相同的名稱,則確實可以使用[CallerMemberName]屬性來減少必須鍵入屬性名稱的次數。
例如:
public class DbSettingsValues : Dictionary<string, string>
{
public string EmailApiServer
{
get => getProperty();
set => setProperty(value);
}
public string EmailApiKey
{
get => getProperty();
set => setProperty(value);
}
public int RegisterFirstEmailDelay
{
get => getProperty(24);
set => setProperty(value);
}
string getProperty(string defaultValue = "", [CallerMemberName] string? propName = default)
{
return this!.GetValueOrDefault(propName, defaultValue);
}
T getProperty<T>(T defaultValue, [CallerMemberName] string? propName = default)
{
var result = this!.GetValueOrDefault(propName, defaultValue!.ToString());
return (T) Convert.ChangeType(result, typeof(T))!;
}
void setProperty(string value, [CallerMemberName] string? propName = default)
{
this[propName!] = value;
}
void setProperty<T>(T value, [CallerMemberName] string? propName = default)
{
this[propName!] = value!.ToString()!;
}
}
它并不完美,但確實顯著減少了錯別字的機會。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/380219.html
