Dreamine.MVVM.Locators 1.0.10
Dreamine.MVVM.Locators 프로젝트의 API와 구성 요소를 제공합니다.
로딩중...
검색중...
일치하는것 없음
ViewNamingConvention.cs
이 파일의 문서화 페이지로 가기
1using System;
2using System.Collections.Generic;
3using System.Linq;
4
6{
15 public static class ViewNamingConvention
16 {
25 private const string ViewModelsToken = "ViewModels";
34 private const string ViewModelToken = "ViewModel";
43 private const string ViewsToken = "Views";
52 private const string ViewToken = "View";
61 private const string PagesToken = "Pages";
70 private const string PageModelsToken = "PageModels";
79 private const string PageModelToken = "PageModel";
88 private const string PageToken = "Page";
97 private const string DotViewModelToken = ".ViewModel";
106 private const string EmptyToken = "";
107
140 public static bool IsLikelyViewType(Type type)
141 {
142 ArgumentNullException.ThrowIfNull(type);
143
144 if (!type.IsClass || type.IsAbstract)
145 {
146 return false;
147 }
148
149 string name = type.Name;
150
151 return name.EndsWith("Window", StringComparison.Ordinal)
152 || name.EndsWith("Page", StringComparison.Ordinal)
153 || name.EndsWith("View", StringComparison.Ordinal)
154 || name.EndsWith("Control", StringComparison.Ordinal)
155 || name.EndsWith("Dialog", StringComparison.Ordinal)
156 || name.EndsWith("Screen", StringComparison.Ordinal)
157 || name.EndsWith("Panel", StringComparison.Ordinal);
158 }
159
192 public static string[] GetViewModelTypeNameCandidates(Type viewType)
193 {
194 ArgumentNullException.ThrowIfNull(viewType);
195
196 string viewName = viewType.Name;
197 string viewNamespace = viewType.Namespace ?? string.Empty;
198 string rootNamespace = GetRootNamespace(viewNamespace);
199 string candidateViewModelName = $"{viewName}ViewModel";
200
201 List<string> results = [];
202
203 foreach (string ns in BuildViewModelCandidateNamespaces(viewNamespace, rootNamespace))
204 {
205 AddIfNotEmpty(results, string.IsNullOrWhiteSpace(ns)
206 ? candidateViewModelName
207 : $"{ns}.{candidateViewModelName}");
208 }
209
210 AddIfNotEmpty(results, candidateViewModelName);
211
212 return [.. results.Distinct(StringComparer.Ordinal)];
213 }
214
247 public static string[] GetViewTypeNameCandidates(Type viewModelType)
248 {
249 ArgumentNullException.ThrowIfNull(viewModelType);
250
251 string viewModelName = viewModelType.Name;
252 if (!viewModelName.EndsWith(ViewModelToken, StringComparison.Ordinal))
253 {
254 return [];
255 }
256
257 string viewName = viewModelName[..^ViewModelToken.Length];
258 string viewModelNamespace = viewModelType.Namespace ?? string.Empty;
259 string rootNamespace = GetRootNamespace(viewModelNamespace);
260
261 List<string> results = [];
262
263 foreach (string ns in BuildViewCandidateNamespaces(viewModelNamespace, rootNamespace))
264 {
265 AddIfNotEmpty(results, string.IsNullOrWhiteSpace(ns)
266 ? viewName
267 : $"{ns}.{viewName}");
268 }
269
270 AddIfNotEmpty(results, viewName);
271
272 return [.. results.Distinct(StringComparer.Ordinal)];
273 }
274
307 public static string[] GetViewTypeNameCandidates(string viewModelFullName)
308 {
309 if (string.IsNullOrWhiteSpace(viewModelFullName))
310 {
311 throw new ArgumentException("ViewModel full name must not be empty.", nameof(viewModelFullName));
312 }
313
314 string[] candidates =
315 [
316 viewModelFullName.Replace(ViewModelsToken, ViewsToken).Replace(ViewModelToken, ViewToken),
317 viewModelFullName.Replace(ViewModelsToken, ViewsToken).Replace(ViewModelToken, EmptyToken),
318 viewModelFullName.Replace(ViewModelsToken, PagesToken).Replace(ViewModelToken, ViewToken),
319 viewModelFullName.Replace(ViewModelsToken, PagesToken).Replace(ViewModelToken, EmptyToken),
320 viewModelFullName.Replace(DotViewModelToken, EmptyToken),
321 viewModelFullName.Replace(DotViewModelToken, ViewToken),
322 viewModelFullName.Replace(PageModelsToken, PagesToken).Replace(PageModelToken, PageToken),
323 viewModelFullName.Replace(PageModelsToken, PagesToken).Replace(PageModelToken, EmptyToken)
324 ];
325
326 return candidates
327 .Where(candidate => !string.IsNullOrWhiteSpace(candidate))
328 .Where(candidate => !string.Equals(candidate, viewModelFullName, StringComparison.Ordinal))
329 .Where(candidate => !candidate.EndsWith(ViewModelToken, StringComparison.Ordinal))
330 .Distinct(StringComparer.Ordinal)
331 .ToArray();
332 }
333
366 private static string[] BuildViewModelCandidateNamespaces(string viewNamespace, string rootNamespace)
367 {
368 List<string> results = [];
369
370 AddIfNotEmpty(results, viewNamespace);
371
372 foreach (string candidate in BuildNamespaceReplacementCandidates(viewNamespace, ViewModelsToken))
373 {
374 AddIfNotEmpty(results, candidate);
375 }
376
377 foreach (string parentNs in ExpandParentNamespaces(viewNamespace))
378 {
379 AddIfNotEmpty(results, $"{parentNs}.ViewModels");
380 AddIfNotEmpty(results, parentNs);
381 }
382
383 AddIfNotEmpty(results, $"{rootNamespace}.ViewModels");
384 AddIfNotEmpty(results, rootNamespace);
385
386 return [.. results.Distinct(StringComparer.Ordinal)];
387 }
388
421 private static string[] BuildViewCandidateNamespaces(string viewModelNamespace, string rootNamespace)
422 {
423 List<string> results = [];
424
425 AddIfNotEmpty(results, viewModelNamespace);
426
427 foreach (string candidate in BuildViewNamespaceCandidatesFromViewModel(viewModelNamespace))
428 {
429 AddIfNotEmpty(results, candidate);
430 }
431
432 foreach (string parentNs in ExpandParentNamespaces(viewModelNamespace))
433 {
434 AddIfNotEmpty(results, $"{parentNs}.Views");
435 AddIfNotEmpty(results, $"{parentNs}.View");
436 AddIfNotEmpty(results, $"{parentNs}.Pages");
437 AddIfNotEmpty(results, $"{parentNs}.GUI");
438 AddIfNotEmpty(results, $"{parentNs}.GUIs");
439 AddIfNotEmpty(results, $"{parentNs}.Dialogs");
440 AddIfNotEmpty(results, $"{parentNs}.Screens");
441 AddIfNotEmpty(results, parentNs);
442 }
443
444 AddIfNotEmpty(results, $"{rootNamespace}.Views");
445 AddIfNotEmpty(results, $"{rootNamespace}.View");
446 AddIfNotEmpty(results, $"{rootNamespace}.Pages");
447 AddIfNotEmpty(results, $"{rootNamespace}.GUI");
448 AddIfNotEmpty(results, $"{rootNamespace}.GUIs");
449 AddIfNotEmpty(results, $"{rootNamespace}.Dialogs");
450 AddIfNotEmpty(results, $"{rootNamespace}.Screens");
451 AddIfNotEmpty(results, rootNamespace);
452
453 return [.. results.Distinct(StringComparer.Ordinal)];
454 }
455
488 private static IEnumerable<string> BuildNamespaceReplacementCandidates(string sourceNamespace, string replacement)
489 {
490 if (string.IsNullOrWhiteSpace(sourceNamespace))
491 {
492 yield break;
493 }
494
495 string[] tokens =
496 [
497 "Views",
498 "View",
499 "Pages",
500 "Page",
501 "Windows",
502 "Window",
503 "Dialogs",
504 "Dialog",
505 "GUI",
506 "GUIs",
507 "Screens",
508 "Screen",
509 "Controls",
510 "Control"
511 ];
512
513 foreach (string token in tokens)
514 {
515 foreach (string candidate in ReplaceNamespaceToken(sourceNamespace, token, replacement))
516 {
517 yield return candidate;
518 }
519 }
520 }
521
546 private static IEnumerable<string> BuildViewNamespaceCandidatesFromViewModel(string sourceNamespace)
547 {
548 if (string.IsNullOrWhiteSpace(sourceNamespace))
549 {
550 yield break;
551 }
552
553 string[] replacements =
554 [
555 "Views",
556 "View",
557 "Pages",
558 "Page",
559 "Windows",
560 "Window",
561 "Dialogs",
562 "Dialog",
563 "GUI",
564 "GUIs",
565 "Screens",
566 "Screen",
567 "Controls",
568 "Control"
569 ];
570
571 foreach (string replacement in replacements)
572 {
573 foreach (string candidate in ReplaceNamespaceToken(sourceNamespace, ViewModelsToken, replacement))
574 {
575 yield return candidate;
576 }
577 }
578 }
579
620 private static IEnumerable<string> ReplaceNamespaceToken(string sourceNamespace, string from, string to)
621 {
622 string middleToken = $".{from}.";
623 if (sourceNamespace.Contains(middleToken, StringComparison.Ordinal))
624 {
625 yield return sourceNamespace.Replace(middleToken, $".{to}.", StringComparison.Ordinal);
626 }
627
628 string endToken = $".{from}";
629 if (sourceNamespace.EndsWith(endToken, StringComparison.Ordinal))
630 {
631 yield return sourceNamespace[..^from.Length] + to;
632 }
633 }
634
659 private static IEnumerable<string> ExpandParentNamespaces(string? ns)
660 {
661 if (string.IsNullOrWhiteSpace(ns))
662 {
663 return Array.Empty<string>();
664 }
665
666 List<string> results = [];
667 string current = ns;
668
669 while (!string.IsNullOrWhiteSpace(current))
670 {
671 int lastDot = current.LastIndexOf('.');
672 if (lastDot < 0)
673 {
674 break;
675 }
676
677 current = current[..lastDot];
678 if (!string.IsNullOrWhiteSpace(current))
679 {
680 results.Add(current);
681 }
682 }
683
684 return results;
685 }
686
711 private static string GetRootNamespace(string ns)
712 {
713 if (string.IsNullOrWhiteSpace(ns))
714 {
715 return string.Empty;
716 }
717
718 int index = ns.IndexOf('.');
719 return index < 0 ? ns : ns[..index];
720 }
721
746 private static void AddIfNotEmpty(List<string> list, string? value)
747 {
748 if (!string.IsNullOrWhiteSpace(value))
749 {
750 list.Add(value);
751 }
752 }
753 }
754}
static IEnumerable< string > BuildViewNamespaceCandidatesFromViewModel(string sourceNamespace)
static string[] GetViewTypeNameCandidates(Type viewModelType)
static IEnumerable< string > ExpandParentNamespaces(string? ns)
static void AddIfNotEmpty(List< string > list, string? value)
static string[] GetViewModelTypeNameCandidates(Type viewType)
static string[] BuildViewModelCandidateNamespaces(string viewNamespace, string rootNamespace)
static IEnumerable< string > BuildNamespaceReplacementCandidates(string sourceNamespace, string replacement)
static string[] BuildViewCandidateNamespaces(string viewModelNamespace, string rootNamespace)
static string[] GetViewTypeNameCandidates(string viewModelFullName)
static IEnumerable< string > ReplaceNamespaceToken(string sourceNamespace, string from, string to)