【问题标题】:Key/Value pair with keys from a defined set具有定义集中的键的键/值对
【发布时间】:2019-04-23 17:52:59
【问题描述】:

对不起,如果这个问题的措辞不正确;我来自 Javascript/Typescript 背景。

我要创建的是一组不可变的键/值对,IDE/编译器将知道哪些键存在或不存在于该列表中。我认为这对于一个类是可能的,也许这确实是最好的选择,但我有兴趣了解是否有其他选择。

例如,对于应用程序的配置,我可以在 Typescript 中:

const config = {
  applicationName: 'Some application',
  port: 8000,
};

const testOne = config.applicationName;
const testTwo = config.fail;             // this would not work

也就是说,编译器或 IDE 使用的某些解释器能够根据结构判断该结构不存在键/值。

在我看来,一个类对于这种数据来说是多余的;虽然我对这门语言比较陌生,这可能是由于我的天真。我想知道 C# 中是否有一个结构可以以不可变的方式存储键和值,并在编译时知道该集合中是否有键/值对。

【问题讨论】:

  • 喜欢Dictionary ?
  • 我认为 IDE/编译器不会检查集合的内容。是的,您正在寻找创建一个类。
  • 啊,我想我误解了你的问题。你想知道,在编译之前myObj.PropertyThatDoesExist IDE 是否会显示错误?
  • 我不确定我是否理解这个问题。您是否尝试过使用课程?您尝试过哪些 C# 代码没有为您提供此功能?另外,“不会工作”,究竟是什么意思?编译器错误?运行时错误?我问的原因是开箱即用,如果您对成员使用类型,这将完全符合您的要求。只需创建一个具有两个属性 ApplicationName 和 Port 的类,就不能在其上设置任意值。
  • The is an XY Problem (Question)。也就是说,您正在尝试使用您有疑问的解决方案来解决问题,而不是实际提出真正的问题。你有所有这些要求(比如不可变的),但没有描述为什么需要它们。这不是一个好问题。

标签: c#


【解决方案1】:

使用anonymous type

var obj = new
{
    applicationName = "",
    port = 9000
};

var name = obj.applicationName;
var something = obj.fail; //doesn't compile

不过,我真的鼓励您创建类并给它们命名,因为您可以从 API 中公开它们。

【讨论】:

  • 这怎么是不可变的?
  • @ErikPhilips 你是对的,我错过了那个。现在我更新了答案以反映这个问题。
  • 这是一个有用的答案,我会看看匿名类型和结构,等待任何进一步的答案,我会接受这个正确的
  • @OliverRadini 回答您编辑过的问题:不,我不认为存在这样的结构既不可变又匿名,至少从我迄今为止在 C# 的经验中看到的情况来看是这样。
  • @meJustAndrew 谢谢!似乎需要从许多不太理想的替代方案中进行选择,而匿名类型可能是最好的选择
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多