【问题标题】:Can a class property/field be of anonymous type in C# 4.0?C# 4.0 中的类属性/字段可以是匿名类型吗?
【发布时间】:2022-05-03 05:19:02
【问题描述】:

如:

public class MyClass {

  private static var MyProp = new {item1 = "a", item2 = "b"};

}

注意:以上不编译也不工作(var不能在那里使用),这只是为了说明我的观点。

更新:为了澄清问题,我已经尝试过使用

private static dynamic MyProp = new {item1 = "a", item2 = "b"};

这可行,但由于动态类型,它不会生成智能感知。我知道匿名类型只是一个编译器技巧,所以我希望我可以通过声明一个结构化字段来利用这个技巧,而不必事先声明一个类(主要是因为只有这种特殊类型的一个实例场地)。我现在可以看到这是不可能的,但我不确定为什么会这样。如果编译器只是为匿名对象生成隐式类型,那么让编译器为字段生成此隐式类型应该相当简单。

【问题讨论】:

  • MyProp 不是属性,而是字段。
  • @Greg :在那里,我为 Diego(和你)修复了它:P
  • @Andrew - 我如释重负,谢谢!
  • @Greg 我的错,谢谢指正

标签: c# .net-4.0 c#-4.0


【解决方案1】:

听起来你可能会问一两个问题,所以我会尝试解决它们。

类字段能否强类型化为匿名类型

没有。匿名类型名称不能在 C# 代码中声明(因此是匿名的)。静态输入它们的唯一方法是

  1. 泛型类型推断
  2. 使用var 关键字

这些都不适用于类型的字段。

类字段可以用匿名类型表达式初始化吗?

是的。该字段只需声明为与匿名类型兼容的类型:例如object

public class MyClass { 
  private static object MyProp = new {item1 = "a", item2 = "b"}; 
} 

【讨论】:

  • Err...所以答案不是“是”,而是“否”?
  • @Adam 答案是问题含糊不清 :) 我会尽量减少我的答案
  • 是的...对象和动态都不给匿名成员。所以答案应该是否定的。
  • 好奇;如果您将匿名类型分配给object,您如何转换它以获取真实类型?
  • @abhishek: object 肯定是一种类型。
【解决方案2】:

不,任何成员都应该是显式类型的。

您可能会选择动态类型,以便让您的成员有机会在运行时进行评估。

【讨论】:

    【解决方案3】:

    在 C# 7 中,您终于可以这样做了:

    private (string Login, string Password) _credentials = (Login: "123", Password: "123");
    

    【讨论】:

    • ValueTuple 与匿名类完全不同。
    【解决方案4】:

    改用Tuple<string, string> 怎么样?

    public class MyClass {
    
      private static Tuple<string, string> MyProp = Tuple.Create("a", "b");
    
    }
    

    【讨论】:

    • 我正要自己提供这个确切的代码块。显式静态类型,您不必手动构造新类型。我真的希望这能在那些愚蠢的“动态”解决方案之前得到支持。
    • 当然,既然你的答案被狙击了,这可能不太可能。
    • 呵呵,好吧。无论如何,元组将是一个很好的解决方案的问题并不一定很清楚。示例代码只有字段“item1”和“item2”,但可能真正的代码有更多的逻辑名称,使用元组会丢失这些名称。由于这是一个私有字段,所以元组可能没问题,但如果这是一个公共字段,我可能会说一个更好的主意是定义一个特定的类型来存储这些数据,即使它需要更多的编码。
    • 确切地说,这个想法是有一个结构化的静态常量字段,并且可以有多层嵌套匿名组件。
    【解决方案5】:

    如果这是 C# 4,请查看 dynamic 关键字。

    public class MyClass 
    { 
      private static dynamic MyProp = new {item1 = "a", item2 = "b"}; 
    } 
    

    但是,一旦您这样做,您就会失去任何类型的类型安全和方便的编译器检查。

    【讨论】:

    • 这就是我所做的,但我失去了对象属性的智能感知。我想这样做,以便智能感知可以帮助人们使用我的课程。
    【解决方案6】:

    命名类的属性(或字段)不能有匿名类型,因为这样的类型不能在代码中引用。 然而,匿名类型可以包含匿名类型的属性:

    var myObj = new
    {
        Foo = new { Name = "Joe", Age = 20 }
    };
    

    但是这样的构造在本地范围之外没有实际用途......

    【讨论】:

      【解决方案7】:

      不,匿名类型不能在它们的声明函数之外暴露为 object 以外的任何东西。虽然匿名类型只是语法糖,实际上创建了一个具体类型,但开发人员永远不知道(也不可用)这种类型,因此无法使用。

      【讨论】:

      • 你说“从不知道”和“不能使用”,但你不是在贬低反射和dynamic吗? (请注意,我并不是在鼓励这种做法。)
      • @Anthony:不,这些都不允许开发人员(如编写代码的人)“知道”类型。您当然可以在对象上调用GetType(),但这是一个仅限运行时的操作。 dynamic 也不是解决方案。
      • 我想说开发人员可以在泛型方法中知道该类型(如 LINQ 所示)。您甚至可以在泛型类中为匿名类型设置一个字段。当然,该字段的使用将非常有限。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多