我有一個在WinForms中使用了多年的擴展方法,但沒有嘗試在新的WPF項目中使用它。方法:如何避免此InvalidCastException?
public static String GetDescription(this Enum value)
{
//var info = value.GetType().GetField(value.ToString());
//if (info != null)
//{
// var attributes = (DescriptionAttribute[])info.GetCustomAttributes(typeof(DescriptionAttribute), false);
// if (attributes != null && attributes.Length > 0)
// return attributes[0].Description;
//}
//return value.ToString();
var info = value.GetType().GetField(value.ToString());
var attributes = Attribute.GetCustomAttributes(info);
if (attributes.Length > 0 && (attributes[0] is System.ComponentModel.DescriptionAttribute))
return ((System.ComponentModel.DescriptionAttribute)attributes[0]).Description;
return value.ToString();
}
第一個塊(即被註釋掉)是原始方法。第二塊是與我一起測試的稍微不同的版本。如果我強迫返回符合投來執行,我得到這個異常:
異常的從對話全文:
附加信息:[A]系統.ComponentModel.DescriptionAttribute不能轉換爲[B] System.ComponentModel.DescriptionAttribute。類型A來源於位於'C:\ TFS_Local \ Antero \ AnteroWPF \ bin \ Debug \ System.ComponentModel'上下文'Default'中的'System.ComponentModel.Primitives,Version = 4.1.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a' .Primitives.dll」。類型B來源於位於'C:\ WINDOWS \ Microsoft.Net \ assembly \ GAC_MSIL \ System \ v4.0_4.0.0'上下文'Default'中的'System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089' .0__b77a5c561934e089 \ System.dll中」。
涉及的兩個組件似乎是:
System.ComponentModel.Primitives.dll
(它存在於構建bin目錄...不完全知道如何到達那裏)
System.dll
(直接從GAC參考,對於明顯原因)
我完全迷失在這裏。如果我刪除了ComponentModel DLL,那就成爲例外。儘管例外聲稱System
具有類型,但似乎沒有可能使用它。即System.ComponentModel.DescriptionAttribute
在沒有相應的DLL的情況下似乎不是一個有效的事情。所以,如果我刪除一個失敗,另一個完全無法使用...那麼爲什麼這個異常甚至發生?!
編輯: 我認爲這是值得什麼,如果我檢查的內存attributes
的價值,我看到陣列確實有一個單一的項目,它是System.ComponentModel.DescriptionAttribute
類型。
與投行 – DonBoitnott
它正常工作對我來說:https://github.com/heldersepu/csharp-proj/commit/c80e3e9828cb08c11cd17031fa10e6a4852878da#diff-225b67798e354b1ad8b608f72aa1ded5 – HelderSepu
@HelderSepu雖然你的例子實際上是不完整的(你的枚舉值做沒有描述屬性),它偶然以這種簡單的形式工作。不幸的是,這對我來說並不明顯。 – DonBoitnott