Как я могу получить типы FieldInfos/PropertyInfos в качестве массива MemberInfo в порядке их размещения в классе?
class Test
{
public bool First { get; set; }
public int Second;
public string Third { get; set; }
}
Как я могу получить типы FieldInfos/PropertyInfos в качестве массива MemberInfo в порядке их размещения в классе?
class Test
{
public bool First { get; set; }
public int Second;
public string Third { get; set; }
}
http://msdn.microsoft.com/en-us/library/ch9714z3.aspx
Метод GetFields не возвращает поля в определенном порядке, например, в алфавитном порядке или в порядке объявления. Ваш код не должен зависеть от порядка, в котором возвращаются поля, поскольку этот порядок меняется.
http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx
Метод GetProperties не возвращает свойства в определенном порядке, например, в алфавитном порядке или в порядке объявления. Ваш код не должен зависеть от порядка возврата свойств, поскольку этот порядок меняется.
Вам нужно будет определить порядок самостоятельно, возможно, с атрибутами:
class Test
{
[Order(1)] public bool First { get; set; }
[Order(2)] public int Second;
[Order(3)] public string Third { get; set; }
}
...
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field,
Inherited = true, AllowMultiple = false)]
[ImmutableObject(true)]
public sealed class OrderAttribute : Attribute {
private readonly int order;
public int Order { get { return order; } }
public OrderAttribute(int order) {this.order = order;}
}
Вы не можете, так как эта информация не относится к исполнению или функциональности класса. Почему вы все равно хотите получить эту информацию?
Посмотрите на Mono.Cecil
Если Serializer может выполнять упорядочивание исходного кода, это не будет из-за информации об отладке PDB.
Я предполагаю, что отражение теряет порядок, потому что оно (потенциально) возвращает комбинацию прямых и унаследованных членов. Не существует "правильного" порядка этого сочетания.
Mono.Cecil позволит вам напрямую обращаться к структурам управляемой сборки, а также к коду CIL. Mono.cecil скаляет большое время и не будет есть ваших щенков. Это самый быстрый способ анализа ваших сборок, и вам даже не нужно загружать их.
Mono.Cecil продолжает писать новую сборку, если вы хотите, но эта пропаганда уходит с темы.
Go получить Mono.Cecil
Информация о номере линии не скомпилирована в сборку, она хранится в файле .PDB для использования отладчика.
Хотя технически возможно получить информацию, которую вы ищете из файла PDB, я не думаю, что это будет хорошей идеей, так как файл PDB не будет присутствовать в рабочей среде. Даже если он есть, нет никакой гарантии, что он синхронизируется с DLL.
Я нашел дополнительную информацию при попытке Google по-другому. Как отмечал JbEvain, подтверждается, что нет способа контролировать порядок, в котором компилятор выводит членов в классах CIL. Этот относится даже к XmlSerializer
Несколько интересных сообщений размещены здесь:
В этой теме я обнаружил, что на самом деле имеет надежный порядок (в .NET 2.0 вы также можете "явно" управлять этим с помощью XmlElementAttribute.Order) [multipalsight-training.net/community/blogs/tewald/archive/2006/04/... и другие
Это должно послужить хорошим основанием для обсуждения. Теперь это действительно зависит от того, что исходный плакат нуждался в этой информации для того, может ли быть даже решение, и если да, то найти путь к достижению этой цели.