Frage

schrieb ich eine Methode, die Felder von einem Objekt wie folgt extrahiert:

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

Jedes Feld in meiner Klasse auch seine eigene Attribute, in diesem Fall hat mein Attribut Htmlattributes bezeichnet wird. Ich versuche, die Attribute für jedes Feld und ihre jeweiligen Werte in der foreach-Schleife zu erhalten. Es sieht derzeit wie folgt aus:

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

Meine Attribute Klasse sieht wie folgt aus:

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

Das scheint logisch, aber es wird nicht kompiliert, ich habe eine rote Wellenlinie in dem GetHTMLAttributes () -Methode unter:

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

Das Feld Ich versuche, um die Attribute zu extrahieren aus in einer anderen Klasse wie folgt verwendet wird:

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

Von meinem Verständnis (oder dessen Fehlen) soll diese Arbeit? Bitte erweitern meine Meinung anderen Entwicklern!

* Edit, Compiler-Fehler :

  

Kann nicht implizit Typ umwandeln   'Object []' auf 'data.HTMLAttributes []'.   Eine explizite Konvertierung vorhanden ist (sind Sie   fehlt ein gegossenes?)

Ich habe versucht, es so Gießen:

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

Aber das auch nicht funktioniert, habe ich diesen Compiler-Fehler:

  

Kann Typ nicht konvertieren 'Object []' zu   'Data.HTMLAttributes'

War es hilfreich?

Lösung

GetCustomAttributes Methode gibt ein object[], nicht HTMLAttributes[]. Der Grund ist es object[] gibt, ist, dass es seit 1.0 gab es, bevor .NET Generika das Licht des Tages sehen.

Sie sollten manuell jedes Element in dem Rückgabewert zu gieße HTMLAttributes.

Ihr Code zu beheben, müssen Sie einfach die Zeile ändern:

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

foreach kümmert sich um die Besetzung für Sie.

Update:

Sie nicht warf das zurückgegebene Array HTMLAttributes[]. Der Rückgabewert wird nicht HTMLAttributes[]. Es ist ein object[] Elemente vom Typ HTMLAttributes enthält. Wenn Sie ein HTMLAttribute[] typisierten Objekt wollen (die Sie nicht in diesem speziellen Code-Schnipsel benötigen, würde foreach genügt), sollte man jedes Element von Array werfen individuell auf HTMLAttribute; vielleicht LINQ mit:

HTMLAttributes[] htmlAttributes = returnValue.Cast<HTMLAttributes>().ToArray();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top