Мне нужно получить все элементы, которые представляют точный состояние объекта с использованием отражения. Таким образом, эти члены включают поля (FieldInfo
) и авто-свойства (PropertyInfo
). Я могу получить все FieldInfo
с с помощьюПростейший способ получить все элементы MemberInfos, которые отражают состояние объекта?
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 для любого типа объекта. Я подумываю о том, чтобы обращаться с ним в общем, чем идти и модифицировать все эти классы. – nawfal
Нужно ли относиться к полям свойств авто-собственности иначе, чем к обычным полям? По моему опыту, «GetFields (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);» захватят их. Или я не понимаю вопрос? –