Ich versuche Reflektion zu verwenden, um Eigenschaften für einige OpenXML-Typen festzulegen (z. B. für die Rechtfertigung). Wert zuweisen, indem sie alle Möglichkeiten aufzuzählen ist straight-forward:Verwenden von Reflektion mit generischen Typen und impliziten Konvertierungen
// attr is an XmlAttribute, so .Name and .Value are Strings
if (attr.Name == "Val")
{
if (element is Justification)
{
((Justification)element).Val = (JustificationValues)Enum.Parse(typeof(JustificationValues), attr.Value);
return;
}
else
{
// test for dozens of other types, such as TabStop
}
}
Was diese schwierige durch Reflexion zu tun macht, ist: 1) Die Art des Val Eigenschaft ist EnumValue <T>, so weiß ich nicht, wie man den Typ extrahiert, der als erstes Argument an Enum.Parse übergeben wird. 2) Es gibt eine implizite Konvertierung vom tatsächlichen Enumerationstyp in den EnumValue < > Typ, den ich nicht weiß, wie ich mit Reflection aufrufe.
würde ich den Code gerne bis Ende etwas suchen, wie:
PropertyInfo pInfo = element.GetType().GetProperty(attr.Name);
Object value = ConvertToPropType(pInfo.PropertyType, attr.Value); /* this
would return an instance of EnumValue<JustificationValues> in this case */
pInfo.SetValue(element, value, null);
Wie kann ich ConvertToPropType implementieren? Oder gibt es eine bessere Lösung?
Dank
Edit: bekam ich eine Lösung mit Earwicker Vorschlag zu arbeiten, aber es stützt sich auf der praktischen Tatsache, dass die Typnamen der Aufzählung aus dem Typnamen des Knotens abgeleitet werden („Begründung“ -> „JustificationValues“). Ich bin aber immer noch neugierig, wie ich das im allgemeinen Fall lösen soll.
Edit2: GetGenericArguments hat mir den Rest des Weg dorthin. Vielen Dank.
tun Haben Sie das Update auf meine Antwort zu sehen? Es zeigt, wie der Enum-Typ vom Eigenschaftstyp abgerufen wird. –