无论如何,要删除C#类属性的重复吗



我有一个这样的类:

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核心?

  • 代码生成器似乎需要一个外部项目。我想这就是EF Core脚手架的工作原理吧?有人能给我推荐一个关键词/链接吗?例如,读取一个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这样的东西可能有用,但我实际上不知道它是如何工作的。

如果键确实与属性具有相同的名称,则确实可以使用[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()!;
}
}

它并不完美,但它确实大大降低了打字错误的几率。

最新更新