我已經更新了我的問題,因爲我意識到我的代碼是原始問題的原因。但是,在進一步調查問題時,我現在遇到了在映射過程中發生在我的代碼中的異常,但我無法捕獲映射表達式擴展。AutoMapper:爲什麼這個異常沒有被捕獲
基本上,當「dictionaryKey」包含字典中找不到的值時,下面的代碼將拋出keynotfoundexception。至於Automapper而言,字典中被映射的源對象保持並請dictionaryKeys是從目標對象上的性質(被映射到):
public dynamic GetValue(string dictionaryKey)
{
return _dictionary[dictionaryKey].Value;
}
的automapper擴展類如下所示完整地,我已經添加了對該行的註釋,導致對上述代碼的調用,拋出異常。問題是它沒有被周圍的代碼所捕獲,而是被拋出到Mapper.Map < ...>(...)調用。是什麼原因導致這個問題,爲什麼是例外而不是try/catch塊內的try catch塊捕獲(我已經添加了破發點,以確認例外的GetValue(被拋出...)的代碼。
public static IMappingExpression<ActiveRecord, TDestination> ConvertFromDictionary<TDestination>(this IMappingExpression<ActiveRecord, TDestination> exp, Func<string, string> propertyNameMapper)
{
foreach (
PropertyInfo pi in typeof (TDestination).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
if (!pi.CanWrite)
continue;
string propertyName = pi.Name;
propertyName = propertyNameMapper(propertyName);
try
{
// The following code will fail when the target read/write property does not exist in the
// source dictionary. This is thrown in GetValue as a KeyNotFoundException. But it is not
// caught in this try/catch. It makes it's way all the way up to the calling code
// i.e. var entity = Mapper.Map<ActiveRecord, EntityDetail>(activeRecord);
exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r.ActiveFields.GetValue(propertyName)));
}
catch (Exception ex)
{
// This is never reached by the exception above
throw ex;
}
}
return exp;
}
UPDATE 雖然「鍵,未發現異常」在通話的GetValue拋出,它是在被冒泡下面的線AutoMapper.AutoMappingException包裹起來:
客戶的客戶= Mapper.Map(記錄);
當然,爲這些對象調用Mapper.Map w生病觸發我的IMappingExpression執行映射,因爲它設置爲:
Mapper.CreateMap()。ConvertFromDictionary(propName => propName);
由於Automapper是automapper內部工作的靜態包裝類,這就是在IMappingExpression的實現中沒有捕獲到異常的原因,而是冒泡到觸發地圖調用本身的代碼?
什麼是你想實現呢? – Omu 2010-09-24 19:29:23
我正在學習automapper,並遇到一些問題 - 在這種情況下,我試圖映射(通過名稱)基本上相當於字典中的名稱/值對的目標類中的屬性。如果目標類包含不在字典中的屬性,則會引發異常(如您所期望的)。但是我無法捕獲異常,exp.ForMember調用包含拋出異常的代碼,但圍繞它的try/catch不捕獲異常。我試圖理解爲什麼和我能做些什麼來解決它。 – 2010-09-26 10:32:31