Подтвердить что ты не робот

С# Получить FieldInfos/PropertyInfos в первоначальном порядке?

Как я могу получить типы FieldInfos/PropertyInfos в качестве массива MemberInfo в порядке их размещения в классе?

class Test
{
    public bool First { get; set; }
    public int Second;
    public string Third { get; set; }
}
4b9b3361

Ответ 1

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;}
}

Ответ 2

Вы не можете, так как эта информация не относится к исполнению или функциональности класса. Почему вы все равно хотите получить эту информацию?

Ответ 3

Посмотрите на Mono.Cecil

Если Serializer может выполнять упорядочивание исходного кода, это не будет из-за информации об отладке PDB.

Я предполагаю, что отражение теряет порядок, потому что оно (потенциально) возвращает комбинацию прямых и унаследованных членов. Не существует "правильного" порядка этого сочетания.

Mono.Cecil позволит вам напрямую обращаться к структурам управляемой сборки, а также к коду CIL. Mono.cecil скаляет большое время и не будет есть ваших щенков. Это самый быстрый способ анализа ваших сборок, и вам даже не нужно загружать их.

Mono.Cecil продолжает писать новую сборку, если вы хотите, но эта пропаганда уходит с темы.

Go получить Mono.Cecil

Ответ 4

Информация о номере линии не скомпилирована в сборку, она хранится в файле .PDB для использования отладчика.
Хотя технически возможно получить информацию, которую вы ищете из файла PDB, я не думаю, что это будет хорошей идеей, так как файл PDB не будет присутствовать в рабочей среде. Даже если он есть, нет никакой гарантии, что он синхронизируется с DLL.

Ответ 5

Я нашел дополнительную информацию при попытке Google по-другому. Как отмечал JbEvain, подтверждается, что нет способа контролировать порядок, в котором компилятор выводит членов в классах CIL. Этот относится даже к XmlSerializer

Несколько интересных сообщений размещены здесь:

В этой теме я обнаружил, что на самом деле имеет надежный порядок (в .NET 2.0 вы также можете "явно" управлять этим с помощью XmlElementAttribute.Order) [multipalsight-training.net/community/blogs/tewald/archive/2006/04/... и другие

Это должно послужить хорошим основанием для обсуждения. Теперь это действительно зависит от того, что исходный плакат нуждался в этой информации для того, может ли быть даже решение, и если да, то найти путь к достижению этой цели.