【发布时间】:2013-05-12 05:47:36
【问题描述】:
我需要使用反射获取代表对象的精确状态的所有成员。所以这些成员包括字段 (FieldInfo) 和自动属性 (PropertyInfo)。我可以使用
FieldInfos
type.GetFields(); //ok some flags needed here
并获得 link 中提到的自动实现的属性:
public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(this PropertyInfo info)
{
bool mightBe = info.GetGetMethod().HasCompilerGeneratedAttribute();
if (!mightBe)
return false;
bool maybe = info.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Where(f => f.Name.Contains(info.Name))
.Where(f => f.Name.Contains("BackingField"))
.Where(f => f.HasCompilerGeneratedAttribute())
.Any();
return maybe;
}
public static bool HasCompilerGeneratedAttribute(this MemberInfo mi)
{
return mi.GetCustomAttributes(typeof(CompilerGeneratedAttribute), true).Any();
}
正如回答者所说,这确实很脆弱。有没有更标准的方法来实现这一目标?我在想,可能是BindingFlags 左右?
type.GetMembers(BindingFlags....) ?
【问题讨论】:
-
这是针对特定对象类型还是针对任何对象类型?如果你想获取特定类型的状态,并且你拥有它们的代码,你可以添加你自己的特殊属性 [ObjectState] 来标记这些字段
-
@omerschleifer 适用于任何对象类型。我正在考虑一般处理它,而不是去修改所有这些类。
-
您需要将自动属性支持字段与常规字段区别对待吗?以我的经验,
GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);会抓住他们。还是我误解了这个问题? -
@JeremyTodd 不,我不需要区别对待它们,我只需要它们。让我试试你的例子。如果它有效,我会通知你,你可以回答:)
-
@nawfal 不确定您想要“面向公众”的内容,但听起来您正在尝试编写自己的序列化过程以将文件输出到要导入的文本(或类似)文件/从其他应用程序导出。在这种情况下,请搜索
Serialization,基于二进制、xml 和 json 格式的工作已经完成。
标签: c# reflection automatic-properties fieldinfo