Статический метод интерфейса C# звонит с дженериками

Мое понимание - то, что те два примера эффективно эквивалентны. Единственная разница - то, что в первом, можно снова использовать скомпилированное регулярное выражение в другом месте, не заставляя его быть скомпилированными снова.

Вот ссылка для Вас: http://diveintopython3.ep.io/refactoring.html

Вызывание поисковой функции объекта скомпилированного шаблона со строкой 'M' выполняет то же самое как звонящий re.search и с регулярным выражением и со строкой 'M'. Только очень, намного быстрее. (На самом деле функция re.search просто компилирует регулярное выражение и называет получающийся метод поиска объекта шаблона для Вас.)

28
задан Dykam 7 August 2009 в 10:06
поделиться

7 ответов

Попробуйте вместо этого использовать метод расширения:

public interface IMyInterface
{
     string GetClassName();
}

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

Это позволяет добавить статический метод расширения / служебной программы, но вам все равно понадобится экземпляр вашей реализации IMyInterface.

У вас не может быть интерфейсов для статических методов, потому что это не имеет смысла, это служебные методы без экземпляра и, следовательно, у них на самом деле нет типа.

25
ответ дан 28 November 2019 в 03:30
поделиться

Вы не можете наследовать статические методы. Ваш код никак не компилируется, потому что интерфейс не может иметь статические методы из-за этого.

Цитируется из littleguru :

Наследование в .NET работает только на база экземпляров. Статические методы определены на уровне типа, а не на уровень экземпляра. Вот почему переопределение не работает со статикой методы / свойства / события ...

Статические методы хранятся только один раз в объем памяти. Нет виртуального стола и т. Д. что создано для них.

Если вы вызываете метод экземпляра в .NET, вы всегда даете ему текущий пример. Это скрыто .NET время выполнения, но бывает. Каждый экземпляр метод имеет в качестве первого аргумента указатель (ссылка) на объект, который метод запущен. Этого не бывает со статическими методами (как они есть определяется на уровне типа). Как следует компилятор решает выбрать метод для вызова?

7
ответ дан 28 November 2019 в 03:30
поделиться

Некоторое время назад я также пытался настроить статический метод для интерфейса, но не знаю почему. Я добавил это в закладки, поэтому, возможно, это поможет:

Интерфейс со статическим методом с использованием методов расширения

3
ответ дан 28 November 2019 в 03:30
поделиться

Если вы указываете сразу после имени типа, вы можете просто сделайте следующее:

public class Helper
{
    static void PrintClassName<T>()
    {
         Console.WriteLine(typeof(T).Name);
    }
}
3
ответ дан 28 November 2019 в 03:30
поделиться

Ответ - квалифицированное «не совсем, но вроде как». Вы можете предоставить статический метод расширения всем разработчикам данного интерфейса и затем вызвать его из вашего разработчика в свойстве или другом методе. В качестве примера:

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();
        }
    }
}

Здесь у нас есть интерфейс (I), который определяет свойство, о котором мы заботимся, и статический метод расширения (GetClassName), который применяется ко всем членам этого типа, который выполняет базовую работу по получению нужной нам информации. . У нас есть класс (пример), который реализует интерфейс I, поэтому, когда мы вызываем наш статический вспомогательный класс, передавая экземпляр примера, он запускает для него статический метод. К сожалению, нельзя напрямую ссылаться на тип T в самом методе как на переменную, вам придется передать экземпляр в приложение.

1
ответ дан 28 November 2019 в 03:30
поделиться

Объявление статического свойства , ] событие или метод в определении интерфейса не считается допустимым определением. Это связано с тем, что интерфейсы считаются контрактами и поэтому

2
ответ дан 28 November 2019 в 03:30
поделиться

Вы можете определить className как атрибут для конкретного класса. Это предпочтительный вариант для хранения метаданных в .net. Таким образом вы можете запросить атрибут для данного класса, и вам не понадобится экземпляр.

0
ответ дан 28 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: