Получение атрибутов поля с использованием отражения в C #

StackOverflow https://stackoverflow.com/questions/1417670

Вопрос

Я написал метод, который извлекает поля из объекта следующим образом:

private static string GetHTMLStatic(ref Object objectX, ref List<string> ExludeFields)
{
    Type objectType = objectX.GetType();
    FieldInfo[] fieldInfo = objectType.GetFields();

    foreach (FieldInfo field in fieldInfo)
    {
        if(!ExludeFields.Contains(field.Name))
        {
            DisplayOutput += GetHTMLAttributes(field);
        }                
    }

    return DisplayOutput;
}

Каждое поле в моем классе также имеет свои собственные атрибуты, в этом случае мой атрибут называется HTMLAttributes. Внутри цикла foreach я пытаюсь получить атрибуты для каждого поля и их соответствующие значения. В настоящее время это выглядит так:

private static string GetHTMLAttributes(FieldInfo field)
{
    string AttributeOutput = string.Empty;

    HTMLAttributes[] htmlAttributes = field.GetCustomAttributes(typeof(HTMLAttributes), false);

    foreach (HTMLAttributes fa in htmlAttributes)
    {
        //Do stuff with the field's attributes here.
    }

    return AttributeOutput;
}

Мой класс атрибутов выглядит так:

[AttributeUsage(AttributeTargets.Field,
                AllowMultiple = true)]
public class HTMLAttributes : System.Attribute
{
    public string fieldType;
    public string inputType;

    public HTMLAttributes(string fType, string iType)
    {
        fieldType = fType.ToString();
        inputType = iType.ToString();
    }
}

Это кажется логичным, но не компилируется, у меня есть красная волнистая линия в методе GetHTMLAttributes () под:

field.GetCustomAttributes(typeof(HTMLAttributes), false);

Поле, из которого я пытаюсь извлечь атрибуты, находится в другом классе, используемом так:

[HTMLAttributes("input", "text")]
public string CustomerName;

Из моего понимания (или его отсутствия) это должно работать? Пожалуйста, расширьте кругозор, коллеги-разработчики!

* Правка, ошибка компилятора :

  

Невозможно неявно преобразовать тип   'object []' to 'data.HTMLAttributes []'.   Явное преобразование существует (вы   пропустил актерский состав?)

Я пытался разыграть его так:

(HTMLAttributes)field.GetCustomAttributes(typeof(HTMLAttributes), false);

Но это также не работает, я получаю эту ошибку компилятора:

  

Невозможно преобразовать тип 'object []' в   'data.HTMLAttributes'

Это было полезно?

Решение

Метод

GetCustomAttributes возвращает объект [] , а не HTMLAttributes [] . Причина, по которой он возвращает object [] , заключается в том, что он существует там с 1.0, до того как дженерики .NET увидят свет.

Вы должны вручную привести каждый элемент возвращаемого значения к HTMLAttributes .

Чтобы исправить свой код, вам просто нужно изменить строку на:

object[] htmlAttributes = field.GetCustomAttributes(typeof(HTMLAttributes), false);

foreach позаботится о вас.

Обновление:

Вы не должны преобразовывать возвращаемый массив в HTMLAttributes [] . Возвращаемое значение не является HTMLAttributes [] . Это объект [] , содержащий элементы типа HTMLAttributes . Если вам нужен типизированный объект HTMLAttribute [] (который вам не нужен в этом фрагменте кода, достаточно foreach ), вам следует привести каждый элемент массива индивидуально к <код> HTMLAttribute ; возможно, используя LINQ:

HTMLAttributes[] htmlAttributes = returnValue.Cast<HTMLAttributes>().ToArray();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top