Question

J'ai écrit une méthode qui extrait les champs d'un objet comme celui-ci:

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

Chaque champ de ma classe possède également ses propres attributs. Dans ce cas, mon attribut s'appelle HTMLAttributes. Dans la boucle foreach, j'essaie d'obtenir les attributs de chaque champ et leurs valeurs respectives. Cela ressemble actuellement à ceci:

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

Ma classe d'attributs ressemble à ceci:

[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();
    }
}

Cela semble logique mais cela ne compilera pas. J'ai une ligne ondulée rouge dans la méthode GetHTMLAttributes () sous:

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

Le champ dans lequel j'essaie d'extraire les attributs est dans une autre classe utilisée comme ceci:

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

De ma compréhension (ou de l'absence de cela), cela devrait-il fonctionner? S'il vous plaît élargir mon esprit, chers développeurs!

* Modification, erreur du compilateur :

  

Impossible de convertir implicitement le type   'objet []' à 'data.HTMLAttributes []'.   Une conversion explicite existe (êtes-vous   manque un casting?)

J'ai essayé de le lancer comme ceci:

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

Mais cela ne fonctionne pas non plus, j'obtiens cette erreur du compilateur:

  

Impossible de convertir le type 'objet []' en   'data.HTMLAttributes'

Était-ce utile?

La solution

La méthode

GetCustomAttributes renvoie un objet [] et non HTMLAttributes [] . La raison pour laquelle il renvoie objet [] est qu'il est là depuis la version 1.0, avant que les génériques .NET ne voient le jour.

Vous devez convertir manuellement chaque élément de la valeur renvoyée en HTMLAttributes .

Pour corriger votre code, il vous suffit de changer la ligne en:

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

foreach se chargera de la distribution pour vous.

Mise à jour:

Vous ne devriez pas convertir le tableau renvoyé en HTMLAttributes [] . La valeur de retour n'est pas HTMLAttributes [] . C'est un objet [] contenant des éléments de type HTMLAttributes . Si vous voulez un objet typé HTMLAttribute [] (que vous n'avez pas besoin dans cet extrait de code spécifique, foreach suffirait), vous devez convertir chaque élément du tableau individuellement en HTMLAttribute ; peut-être en utilisant LINQ:

HTMLAttributes[] htmlAttributes = returnValue.Cast<HTMLAttributes>().ToArray();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top