Как получить заданную фиксированную длину поля из библиотеки FileHelpers?

Я использую библиотеку FileHelpers для записи выходных файлов. Вот пример фрагмента кода:

 public class MyFileLayout
 {
    [FieldFixedLength(2)]
    private string prefix;

    [FieldFixedLength(12)]
    private string customerName;
 }

В моем потоке кода я хотел бы знать длину каждого из этих полей во время выполнения, например: это 12 для customerName.

Есть ли способ получить значения, как указано выше, из библиотеки FileHelpers?


person vijay    schedule 13.08.2013    source источник
comment
Вы хотите получить значения атрибутов?   -  person Matten    schedule 13.08.2013
comment
Да, но это относится к библиотеке FileHelpers, я уже задавал вопрос о получении значения атрибута, http://stackoverflow.com/questions/18201971/how-do-i-get-the-custom-значение-атрибута-поля/   -  person vijay    schedule 13.08.2013


Ответы (1)


Я не думаю, что вам нужна библиотека для чтения свойств FieldAttribute.

        public class MyFileLayout
        {
            [FieldFixedLength(2)]
            public string prefix;

            [FieldFixedLength(12)]
            public string customerName;
        }




        Type type = typeof(MyFileLayout);
        FieldInfo fieldInfo = type.GetField("prefix");
        object[] attributes = fieldInfo.GetCustomAttributes(false);

        FieldFixedLengthAttribute attribute = (FieldFixedLengthAttribute)attributes.FirstOrDefault(item => item is FieldFixedLengthAttribute);

        if (attribute != null)
        {
            // read info
        }

Я сделал для него метод:

    public bool TryGetFieldLength(Type type, string fieldName, out int length)
    {
        length = 0;

        FieldInfo fieldInfo = type.GetField(fieldName);

        if (fieldInfo == null)
            return false;

        object[] attributes = fieldInfo.GetCustomAttributes(false);

        FieldFixedLengthAttribute attribute = (FieldFixedLengthAttribute)attributes.FirstOrDefault(item => item is FieldFixedLengthAttribute);

        if (attribute == null)
            return false;

        length = attribute.Length;
        return true;
    }

Применение:

        int length;
        if (TryGetFieldLength(typeof(MyFileLayout), "prefix", out length))
        {
            Show(length);
        }

PS: поля/свойства должны быть общедоступными, чтобы можно было читать их атрибуты с отражением.

person Jeroen van Langen    schedule 13.08.2013
comment
Я специально пометил это с помощью FileHelpers. Получение значения атрибута будет работать, за исключением того, что в FileHelpers свойство Length объявлено как внутреннее, поэтому я не могу использовать этот способ. пожалуйста, обратитесь к моему предыдущему вопросу [stackoverflow.com/questions/18201971/ (stackoverflow.com/questions/18201971/) - person vijay; 13.08.2013