我試圖使用反射來設置某些OpenXML類型的屬性(例如對齊方式)。通過枚舉所有可能分配一個值是直接的:使用通用類型和隱式轉換的反射
// 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
}
}
是什麼讓這很難通過反射做的是: 1)型瓦爾屬性是EnumValue <牛逼>,所以我不知道如何提取要作爲第一個參數傳遞給Enum.Parse的類型。 2)有一個從實際枚舉類型到EnumValue類型的隱式轉換,我不知道如何用反射調用。
我想的代碼最終看起來像:
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);
如何實現ConvertToPropType?還是有更好的解決方案?
感謝
編輯: 我得到了一個解決方案使用埃裏克的建議的工作,但它依靠便捷的事實枚舉的類型名稱可以從該節點的類型名稱派生(「理由」 - >「JustificationValues」 )。不過,我仍然很好奇如何在一般情況下解決這個問題。
編輯2: GetGenericArguments讓我在那裏的其餘部分。謝謝。
你有沒有看到更新我的答案?它演示瞭如何從屬性類型獲取枚舉類型。 – 2009-07-21 06:22:09