获取匿名类型的读/写属性

我需要获取可以写入的匿名类型的所有属性。

例如:

var person = new {Name = "Person's Name", Age = 25}; Type anonymousType = person.GetType(); var properties = anonymousType.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

问题是所有属性的CanWrite属性都为false 。 对于非匿名类型,返回true。
我也试过调用PropertyInfo.GetSetMethod() ,它返回null
如何检查属性是否可以写入?

编辑:也许知道一个类型是否是匿名的就足够了。 如何使用reflection查明某个类型是匿名的?

从C#生成的匿名类型总是不可变的,因此可写属性集是空的。 在VB中它是可选的:每个属性默认为可变,但如果你用Key作为前缀它是不可变的; 仅使用Key计数声明的属性用于相等和哈希码生成。 我个人更喜欢C#的方法。

对于非匿名类型的属性, CanWrite并不总是返回true – 仅适用于可写类型。 属性可以是只读,只写或读写。 例如:

 public class Test { // CanWrite will return false. CanRead will return true. public int ReadOnly { get { return 10; } } // CanWrite will return true. CanRead will return false. public int WriteOnly { set {} } // CanWrite will return true. CanRead will return true. public int ReadWrite { get { return 10; } set {} } } 

由于.NET 2.0运行时不支持匿名类型,因此没有可靠的方法来确定类型是否是匿名的。 依赖于“编译器生成的名称”的格式不是一个安全的修复,因为这可能会随着编译器的不同版本而改变。

听起来你回答了自己的问题:“如何使用上述语句检查属性是否可以写入”:CanWrite为false,GetSetMethod(true)返回null。 这些是你不能写信给房产的两个标志。

由于我们在.NET 2.0运行时,System.Type上没有“IsAnonymous”属性,因此您没有任何可靠的方法来识别匿名类型。

无法分配匿名类型的属性,因此reflection报告正确。

如果您要查看已编译的IL,您会注意到虽然C#代码看起来像是使用普通的初始化程序,但它会被编译器重写为构造函数调用,这允许属性在外部是不可写的class上的。

如何使用reflection查明某个类型是匿名的?

我想你可以检查类型是否具有CompilerGenerated属性

如何使用reflection查明某个类型是匿名的?

只需使用此代码。

 var isAnonymousType = Attribute.IsDefined(dataType, typeof (CompilerGeneratedAttribute), false) && dataType.IsGenericType && dataType.FullName.Contains("Anonymous") && (dataType.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic;