Statyczne wywołanie metody interfejsu C # z generikami

Czy istnieje prosty sposób na zaimplementowanie tego i jeśli to możliwe bez instancjowania obiektu:

interface I
{
     static  string GetClassName();
}

public class Helper
{

    static void PrintClassName<T>() where T : I
    {
         Console.WriteLine(T.GetClassName());
    }
}
Author: Dykam, 2009-08-07

7 answers

Zamiast tego spróbuj użyć metody rozszerzenia:

public interface IMyInterface
{
     string GetClassName();
}

public static class IMyInterfaceExtensions
{
    public static void PrintClassName<T>( this T input ) 
        where T : IMyInterface
    {
         Console.WriteLine(input.GetClassName());
    }
}

Pozwala to na dodanie statycznej metody rozszerzenia / narzędzia, ale nadal potrzebujesz instancji implementacji interfejsu IMyInterface.

Nie możesz mieć interfejsów dla metod statycznych, ponieważ nie miałoby to sensu, są to metody użytkowe bez instancji i dlatego tak naprawdę nie mają typu.

 24
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-30 19:00:18

Nie można dziedziczyć metod statycznych. Twój kod nie skompilowałby się w żaden sposób, ponieważ interfejs nie może mieć statycznych metod z tego powodu.

Cytat z littleguru :

Dziedziczenie w. NET działa tylko na baza instancji. Metody statyczne to zdefiniowany na poziomie typu, a nie na poziom instancji. Dlatego nadrzędne nie działa ze statycznymi metody/właściwości / zdarzenia...

Metody statyczne są przechowywane tylko raz w pamięć. Nie ma wirtualny stół itp. to jest dla nich stworzone.

Jeśli wywołasz metodę instancji w . NET, zawsze dajesz to aktualne przykład. To jest ukryte przez. Net runtime, ale zdarza się. Każda instancja metoda ma jako pierwszy argument wskaźnik (odniesienie) do obiektu, który metoda jest uruchomiona. To się nie zdarza. metodami statycznymi (gdyż są zdefiniowany na poziomie typu). jak powinno kompilator decyduje o wyborze metoda wywoływania?

 7
Author: Dykam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 10:05:36

Próbowałem też skonfigurować statyczną metodę na interfejsie jakiś czas temu, Nie wiem dlaczego teraz. Zrobiłem zakładkę, więc może to pomoże:

Interfejs z metodą statyczną za pomocą metod rozszerzenia

 3
Author: Nick Clarke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 10:09:21

Jeśli szukasz nazwy typu, możesz to zrobić:

public class Helper
{
    static void PrintClassName<T>()
    {
         Console.WriteLine(typeof(T).Name);
    }
}
 3
Author: Kent Boogaart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-27 16:33:00

Deklarowanie a static property, event or method on a interface definition is not considered a legal definition. Dzieje się tak dlatego, że interfejsy są uważane za umowy i jako takie reprezentują coś, co będzie implementowane przez każdą instancję klienta tego interfejsu.

A static deklaracja zasadniczo stwierdza, że element static nie wymaga fizycznej implementacji klienta w celu wykonania wymaganej funkcjonalności i nie jest to ogólne pojęcie interfejsy: zapewnienie sprawdzonej umowy.

 2
Author: Mike J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 10:22:42

Odpowiedzią jest kwalifikowane "nie naprawdę, ale coś w tym rodzaju". Możesz podać statyczną metodę rozszerzenia wszystkim implementatorom danego interfejsu, a następnie wywołać ją z implementatora we właściwości lub innej metodzie. Jako przykład:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InterfacesWithGenerics
{
    class Program
    {
        static void Main(string[] args)
        {
            Helper.PrintClassName<Example>(new Example());
            Console.ReadLine();
        }
    }

    public class Example : I
    {
        #region I Members

        public string ClassName
        {
            get { return this.GetClassName(); }
        }

        #endregion
    }

    public interface I
    {
        string ClassName { get; }
    }

    public class Helper
    {

        public static void PrintClassName<T>(T input) where T : I
        {           
            Console.WriteLine( input.GetClassName()) ;
        }
    }

    public static class IExtensions
    {
        public static string GetClassName(this I yourInterface)
        {
            return yourInterface.GetType().ToString();
        }
    }
}

Tutaj mamy interfejs (i), który definiuje właściwość, na której nam zależy, oraz statyczną metodę rozszerzenia (GetClassName), która jest stosowana do wszystkich członków jego typu, która wykonuje gruntową pracę uzyskiwania żądanych informacji. Mamy klasę (Example), który implementuje interfejs I, więc kiedy wywołujemy naszą statyczną klasę pomocniczą przekazującą w instancji Example, uruchamia ona metodę statyczną przeciwko niej. Niestety nie jest poprawne odwoływanie się do typu T bezpośrednio w samej metodzie jako do zmiennej, będziesz musiał przekazać instancję do aplikacji.

 1
Author: Wolfwyrd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 10:11:21

Możesz zdefiniować nazwę klasy jako atrybut na danej klasie. Jest to preferowany ay do przechowywania metadanych w .net. w ten sposób możesz odpytywać atrybut dla danej klasy i nie potrzebujesz instancji.

 0
Author: codymanix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-26 22:55:00