Property zdobywająca włąsną nazwę.

0

najpierw strzelam, potem pytania


using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
...
public class BaseClass
{
     ... GetValue() ..
     ... SetValue() ... 
}

 public class WCConfig : BaseClass
    {
        public WCConfig(Arg arg) : base(arg)
        {
        }

       [Display(Name = "URL główny", Order = 20)]
       public string Url
        {
            get { return GetValue("Url", " "); }
            set { SetValue("Url", value); }
        }

       [Display(Name = "Drugi parametr", Order = 30)]
       public string Drugi
        {
           get { return GetValue("Drugi", "(defalt) "); }
            set { SetValue("Drugi", value); }
        }
}

Od lat Ctrl-C Ctrl-V, ale to mnie dręczy niesamowicie.
najbardziej mnie męczą słowa na tym przykładzie Url i Drugie. Zbawienny byłby trick, żeby właściwość wiedziała o sobie samej, i sama wypracowała nazwę, z jaką ma pracować

W Javie generowało się StackTrace (bez rzucania wyjątkiem), brało konkretną ramkę od wierzchu (drugą, trzecią - trzeba raz sprawdzić) i tam była nazwa metody. Hipotetycznie wywołanie metody get_Url i get_Drugi (tu przemieszczam się do pisowni C#), oczywiste że coś z tym można zrobić,
Ale Java nie ma na poziomie syntaktycznych własciwości (ma przez konwencję, zresztą dość słabą).

Jaki fajny trick można zastosować?

Aha, w/w klasa bindowane są do pól edycyjnych, i bardzo preferuję takie jednostopniowe dziedziczenie, niż obserwator, który kopiuje.
Koszt CPU jest nieistotny, i tak człowiek jest najwolniejszy.

2
GetValue([CallerMemberName] string name = null)

i wywołujesz GetValue() a kompilator automatycznie wstawi nazwę property do parametru. https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.callermembernameattribute?view=netcore-3.1

Jeśli chcesz jeszcze bardziej zautomatyzować to możesz użyć np fody:

https://github.com/Fody/PropertyChanged

a jeśli chodzi tylko o generowanie kodu to możesz użyć T4: https://docs.microsoft.com/en-us/visualstudio/modeling/code-generation-and-t4-text-templates?view=vs-2019

albo dynamiczne proxy:
http://jonas.follesoe.no/oldblog/2009-12-23-automatic-inotifypropertychanged-using-dynamic-proxy/
można zmusić kontener do automatycznego opakowania klas w dekorator to robiący - to trochę jaśniejsze podejście niż AOP, łatwiej debugować i znaleźć kod który to magicznie robi, ale są też minusy - nieudekorowana klasa może wyciec przez użycie this na zewnątrz i przestać gdzieś działać.

Do AOP jeśli się skusisz najlepszy oczywiście PostSharp: https://www.postsharp.net/

0
AnyKtokolwiek napisał(a):

W Javie generowało się StackTrace (bez rzucania wyjątkiem), brało konkretną ramkę od wierzchu (drugą, trzecią - trzeba raz sprawdzić) i tam była nazwa metody. Hipotetycznie wywołanie metody get_Url i get_Drugi (tu przemieszczam się do pisowni C#), oczywiste że coś z tym można zrobić,

Tak z ciekawości - czemu nie zrobiłeś tego samego w C#? Pewnie nawet nazwy klas i metod są takie same.
new StackTrace().GetFrame(0).GetMethod().Name

1 użytkowników online, w tym zalogowanych: 0, gości: 1