有什么可以使用,以确定一个类型是否实际上是一个匿名类型?例如界面等?
目标是创建以下内容......
//defined like... public static T Get(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 ("age");
或者这只是匿名类型的美丽?没有什么可以自我识别,因为它需要一个新的形状?
注意 - 我意识到你可以为对象类编写一个扩展方法,但在我看来,这看起来有点矫枉过正.
编辑:下面的列表适用于C#匿名类型.VB.NET有不同的规则 - 特别是,它可以生成可变的匿名类型(默认情况下).Jared在评论中指出,命名风格也不同.基本上这都非常脆弱......
您无法在通用约束中识别它,但是:
它将是一个类(而不是接口,枚举,结构等)
它将应用CompilerGeneratedAttribute
它将覆盖Equals,GetHashCode和ToString
它将位于全局命名空间中
它不会嵌套在另一种类型中
它将是内部的
它将被密封
它将直接来自 object
它将是通用的,具有与属性一样多的类型参数.(你可以有一个非通用的匿名类型,没有属性.虽然它有点无意义.)
每个属性都有一个类型参数,其名称包含属性名称,并且属于该类型参数,例如,Name属性成为类型<> _ Name的属性
每个酒店都是公开的,只读
对于每个属性,将存在相应的只读私有字段
没有其他属性或字段
将有一个构造函数采用与每个类型参数对应的一个参数,其顺序与类型参数相同
每个方法和属性都将应用DebuggerHiddenAttribute.
类型的名称将以"<>"开头并包含"AnonymousType"
但是,规范保证这一点很少 - 所以它可以在下一版本的编译器中更改,或者如果你使用Mono等.