一尘不染

匿名类型-有什么明显的特点吗?

c#

有什么可用来确定类型是否实际上是匿名类型的东西吗?例如界面等?

目标是创建类似于以下内容的内容…

//defined like...
public static T Get<T>(this IAnonymous obj, string prop) {
    return (T)obj.GetType().GetProperty(prop).GetValue(obj, null);
}
//...

//And then used like...
var something = new { name = "John", age = 25 };
int age = something.Get<int>("age");

还是仅仅是匿名类型的美?没有什么可以自我识别的,因为它采用了新的形状?

注意 -我意识到您可以为 对象 类编写扩展方法,但是在我看来,这似乎有点过头了。


阅读 483

收藏
2020-05-19

共1个答案

一尘不染

编辑:下面的列表适用于C#匿名类型。VB.NET具有不同的规则-
特别是,它可以生成可变的匿名类型(默认情况下会生成)。贾里德(Jared)在评论中指出,命名方式也有所不同。基本上,这一切都很脆弱…

您无法在一般约束中识别它,但是:

  • 它将是一个类(而不是接口,枚举,结构等)
  • 它将应用CompilerGeneratedAttribute
  • 它将覆盖Equals,GetHashCode和ToString
  • 它将在全局名称空间中
  • 它不会嵌套在其他类型中
  • 这将是内部的
  • 将被密封
  • 它将直接从 object
  • 它将具有与属性一样多的类型参数。(您 可以 有一个没有属性的非泛型匿名类型。尽管如此,这毫无意义。)
  • 每个属性将具有一个类型参数,其名称包括属性名称,并且将具有该类型参数,例如Name属性将成为类型<> _ Name的属性
  • 每个属性都是公开且只读的
  • 对于每个属性,将有一个对应的只读专用字段
  • 将没有其他属性或字段
  • 将有一个构造函数采用一个与每个类型参数相对应的参数,其顺序与类型参数相同
  • 每个方法和属性都将应用DebuggerHiddenAttribute
  • 类型的名称将以“ <>”开头,并包含“ AnonymousType”

但是,规范对此几乎没有保证-因此在下一版本的编译器中,或者如果您使用Mono等,都可能会更改。

2020-05-19