匿名类型 - 是否有任何distingushing特征?

Hug*_*are 26 .net c# generics extension-methods anonymous-types

有什么可以使用,以确定一个类型是否实际上是一个匿名类型?例如界面等?

目标是创建以下内容......

//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");
Run Code Online (Sandbox Code Playgroud)

或者这只是匿名类型的美丽?没有什么可以自我识别,因为它需要一个新的形状?

注意 - 我意识到你可以为对象类编写一个扩展方法,但在我看来,这看起来有点矫枉过正.

Jon*_*eet 55

编辑:下面的列表适用于C#匿名类型.VB.NET有不同的规则 - 特别是,它可以生成可变的匿名类型(默认情况下).Jared在评论中指出,命名风格也不同.基本上这都非常脆弱......

您无法在通用约束中识别它,但是:

  • 它将是一个类(而不是接口,枚举,结构等)
  • 它将应用CompilerGeneratedAttribute
  • 它将覆盖Equals,GetHashCode和ToString
  • 它将位于全局命名空间中
  • 它不会嵌套在另一种类型中
  • 它将是内部的
  • 它将被密封
  • 它将直接来自 object
  • 它将是通用的,具有与属性一样多的类型参数.(你可以有一个非通用的匿名类型,没有属性.虽然它有点无意义.)
  • 每个属性都有一个类型参数,其名称包含属性名称,并且属于该类型参数,例如,Name属性成为类型<> _ Name的属性
  • 每个酒店都是公开的,只读
  • 对于每个属性,将存在相应的只读私有字段
  • 没有其他属性或字段
  • 将有一个构造函数采用与每个类型参数对应的一个参数,其顺序与类型参数相同
  • 每个方法和属性都将应用DebuggerHiddenAttribute.
  • 类型的名称将以"<>"开头并包含"AnonymousType"

但是,规范保证这一点很少 - 所以它可以在下一版本的编译器中更改,或者如果你使用Mono等.

  • <> name前缀仅为C#.在VB中,名称前缀为"VB $ AnonymousType" (8认同)
  • 我不知道为什么有人会这样做,但如果传入的匿名类型是"new {}",它将不是通用的,它将具有"默认"构造函数. (3认同)
  • 哦,这值得了解.我敢说其他一些东西也只适用于C# - 特别是因为VB可以是可变的.将编辑以反映这一点. (2认同)