네임스페이스 및 접미사 후보 중 구체적인 ViewModelBase 파생 형식을 찾습니다.
290 {
291
292 var candidates = new List<string>();
293
294
295 candidates.Add(actualTypeName + "ViewModel");
296 candidates.Add(StripViewSuffix(actualTypeName) + "ViewModel");
297
298
299 if (actualTypeName.Contains(".Pages.", StringComparison.OrdinalIgnoreCase))
300 {
301 var pagesToVm = actualTypeName.Replace(".Pages.", ".ViewModels.", StringComparison.OrdinalIgnoreCase);
302 candidates.Add(pagesToVm + "ViewModel");
303 candidates.Add(StripViewSuffix(pagesToVm) + "ViewModel");
304 }
305
306
307 if (actualTypeName.Contains(".Views.", StringComparison.OrdinalIgnoreCase))
308 {
309 var viewsToVm = actualTypeName.Replace(".Views.", ".ViewModels.", StringComparison.OrdinalIgnoreCase);
310 candidates.Add(viewsToVm + "ViewModel");
311 candidates.Add(StripViewSuffix(viewsToVm) + "ViewModel");
312 }
313
314
315 if (viewType != null)
316 {
317 string viewNs = viewType.Namespace ?? string.Empty;
318 string viewName = viewType.Name;
319 string viewNameNoSuffix = StripViewSuffix(viewName);
320 if (!string.IsNullOrWhiteSpace(viewNs))
321 {
322 candidates.Add($"{viewNs}.ViewModels.{viewName}ViewModel");
323 candidates.Add($"{viewNs}.ViewModels.{viewNameNoSuffix}ViewModel");
324 candidates.Add($"{viewNs}.{viewName}ViewModel");
325 candidates.Add($"{viewNs}.{viewNameNoSuffix}ViewModel");
326
327
328 if (viewNs.Contains(".Views", StringComparison.OrdinalIgnoreCase))
329 {
330 string swappedNs = viewNs.Replace(".Views", ".ViewModels", StringComparison.OrdinalIgnoreCase);
331 candidates.Add($"{swappedNs}.{viewName}ViewModel");
332 candidates.Add($"{swappedNs}.{viewNameNoSuffix}ViewModel");
333 }
334 }
335
336
337 candidates.Add(viewName + "ViewModel");
338 candidates.Add(viewNameNoSuffix + "ViewModel");
339 }
340
341
342 candidates = candidates
343 .Where(x => !string.IsNullOrWhiteSpace(x))
344 .Distinct(StringComparer.OrdinalIgnoreCase)
345 .ToList();
346
347
348 foreach (var cand in candidates)
349 {
350 var t = AppDomain.CurrentDomain.GetAssemblies()
351 .SelectManySafe(a => a.GetTypesSafe())
352 .FirstOrDefault(x =>
353 x.FullName?.Equals(cand, StringComparison.OrdinalIgnoreCase) == true ||
354 x.Name.Equals(cand.Split('.').Last(), StringComparison.OrdinalIgnoreCase));
355
356 if (t == null)
357 {
358 continue;
359 }
360
361
362 if (!t.IsClass || t.IsAbstract)
363 {
364 continue;
365 }
366
367
368 if (typeof(FrameworkElement).IsAssignableFrom(t))
369 {
370 continue;
371 }
372
373
374 if (!typeof(ViewModelBase).IsAssignableFrom(t))
375 {
376 continue;
377 }
378
379 return t;
380 }
381
382 return null;
383 }