当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《匿名类型-是否有任何distingushing特征?》经验,为你挑选了1个好方法。

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

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

//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");

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

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



1> Jon Skeet..:

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

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

它将是一个类(而不是接口,枚举,结构等)

它将应用CompilerGeneratedAttribute

它将覆盖Equals,GetHashCode和ToString

它将位于全局命名空间中

它不会嵌套在另一种类型中

它将是内部的

它将被密封

它将直接来自 object

它将是通用的,具有与属性一样多的类型参数.(你可以有一个非通用的匿名类型,没有属性.虽然它有点无意义.)

每个属性都有一个类型参数,其名称包含属性名称,并且属于该类型参数,例如,Name属性成为类型<> _ Name的属性

每个酒店都是公开的,只读

对于每个属性,将存在相应的只读私有字段

没有其他属性或字段

将有一个构造函数采用与每个类型参数对应的一个参数,其顺序与类型参数相同

每个方法和属性都将应用DebuggerHiddenAttribute.

类型的名称将以"<>"开头并包含"AnonymousType"

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


<> name前缀仅为C#.在VB中,名称前缀为"VB $ AnonymousType"
我不知道为什么有人会这样做,但如果传入的匿名类型是"new {}",它将不是通用的,它将具有"默认"构造函数.
哦,这值得了解.我敢说其他一些东西也只适用于C# - 特别是因为VB可以是可变的.将编辑以反映这一点.
推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有