Wiem, że pytanie może wydawać dość ogólne, ale czy jest coś specyficznego dla C#?
Np.:
Delegate(Type, String) - dla metody statycznej
Delegate(Object, String) - dla metody w obiekcie
Wiem, że pytanie może wydawać dość ogólne, ale czy jest coś specyficznego dla C#?
Np.:
Delegate(Type, String) - dla metody statycznej
Delegate(Object, String) - dla metody w obiekcie
Należy rozpocząć od tego, że typ Delegate jako część .net Framework BCL (Base Class Library) nie jest specyficzny dla języka C#. Równocześnie typ Delegate nie jest specyficzny dla metod statycznych czy instancyjnych, czyli odpowiedź wprost brzmi: nie mamy różnych typów delegatów dla metod statycznych i instancyjnych. Pytanie otrzymało status "ciekawe" m.in. ze względu na odwołania w treści pytania do dokumentacji klasy Delegate dotyczące dwóch konstrukorów tej klasy. Patrząc na definicję typu - modyfikator dostępu (protected) dla konstruktorów oraz fakt, że klasa Delegate jest abstrakcyjna dojdziemy do wniosku, że można te konstruktory wywołać jedynie z klas wywiedzionych. Idąc dalej, dochodzimy do wniosku, że nie możemy dziedziczyć bezpośrednio po klasie Delegate i pozostaje nam wywołanie metody fabryki CreateDelegate. W tym miejscu powstaje pytanie, czy dla metod statycznych i instancyjnych CreateDelegate to najprostszy sposób na utworzenie delegacji? Oczywiście nie - znacznie wygodniej będziemy operować na składowych przy użyciu wbudowanych typów Action oraz Function. Dla zobrazowania sposobów wywołania metody zarówno za pomocą typu Delegate, jak i Action w przypadku składowych statycznych i instancyjnych możemy posłużyć się przykładem:
class Program { static void Main(string[] args) { Type toolType = typeof(Tool); Action actionStaticMeth = Tool.SayHello; Delegate staticMeth = (Action) Tool.SayHello ; actionStaticMeth.Invoke(); staticMeth.DynamicInvoke(); Action ActionInstMeth = (new Tool()).SayYourHashCode; Delegate instMeth = (Action) (new Tool()).SayYourHashCode; ActionInstMeth.Invoke(); instMeth.DynamicInvoke(); } } public class Tool { public static void SayHello() { Console.WriteLine("hello"); } public void SayYourHashCode() { Console.WriteLine(this.GetHashCode()); } }