Как создать автоматически реализованные свойства при реализации интерфейса в классе?

Когда я впервые внедряю интерфейс в класс, я хочу либо resharper 6, либо visual studio 2010 реализовать мои свойства как автоматически реализованные свойства и не поместить значение по умолчанию для throw new NonImplementedException() ;. Как я могу это сделать? Например:

public interface IEmployee
{
// want this to stay just like this when  implemented into class
ID { get; set; }
}

public class Employee : IEmployee
{
// I do not want the throw new NonImplemented exception
// I want it to just appear as an auto implemented property
// as I defined it in the interface
public int ID
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
}

Поскольку это происходит все время, я обнаруживаю, что мне приходится постоянно реорганизовывать и вручную удалять эти новые исключения UnImplimented() и вручную создавать свойства автоматически... боль! В конце концов, я определил его как свойство, реализованное автоматически в моем интерфейсе.

Любая помощь или совет очень ценится! Благодарю.

Ответ 1

Примечание. Ваши комбинации клавиш R # могут отличаться, я использую схему клавиатуры Resharper 2.x.

Если вы объявите интерфейс в классе, а затем используйте Alt + Enter и выберите "Реализовать участников":

выбирающий

Затем вы получите реализацию по умолчанию, которая, случается, бросает NotImplementedException, если вы не измените ее.

Но если вы проигнорируете предложенный курс действий и вместо этого используйте Alt + Insert, чтобы открыть меню Generate, вы можете выбрать "Missing members":

выбирающий

Это откроет окно "Создать", в котором вы можете выбрать, чтобы реализовать свойство (или свойства) в автоматическом режиме:

Generate window

Это будет делать именно то, что вы хотите:

class Employee : IEmployee
{
    public int Id { get; set; }
}

Ответ 2

В конце концов, я определил его как свойство, реализованное автоматически в моем интерфейсе.

Нет, нет. Вы объявили его как свойство без реализации. Это все, что вы можете сделать в интерфейсе: вы просто говорите, что классы, реализующие интерфейс, должны обеспечивать конкретные реализации таких свойств.

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

С точки зрения вашего точного вопроса: я не знаю, можно ли изменить стандартную реализацию VS или R # для интерфейсов, но я бы, если честно, не смог бы внести эти изменения.

EDIT: В параметрах R # "Генерация кода" вы можете выбирать между выбросом исключения, возвратом значения по умолчанию или получением несовместимого кода. Возможно, что это будет делать то, что вы хотите. Дайте ему уйти, но я все равно настоятельно призываю вас тщательно подумать, прежде чем идти по этому пути.

Ответ 3

Интерфейс не предназначен для указания того, как будут реализованы методы, поэтому с ним интерфейс не существует. Одним из решений было бы создание абстрактного базового класса с автоматически реализованными свойствами и наследование этого класса вместо прямого внедрения интерфейса.

Ответ 4

Вот краткое обходное решение, которое я нашел в VS2015. Отметьте свой класс как абстрактный, затем реализуйте интерфейс абстрактно. Это добавляет свойства авто для вас, тогда вы просто заменяете "abstract" на "" в вашем файле. Затем вы можете удалить ключевое слово abstract из своего класса.

Ответ 5

В случае VS2015 я использую макрос поиска и замены в качестве обходного пути:

Find:
(\r|\n| |\t)+\{(\r|\n| |\t)+get(\r|\n| |\t)+\{(\r|\n| |\t)+throw(\r|\n| |\t)+new(\r|\n| |\t)+NotImplementedException\(\);(\r|\n| |\t)+\}(\r|\n| |\t)+set(\r|\n| |\t)+\{(\r|\n| |\t)+throw(\r|\n| |\t)+new(\r|\n| |\t)+NotImplementedException\(\);(\r|\n| |\t)+\}(\r|\n| |\t)+\}

replace:
 {get;set;}

Ответ 6

Помимо ответа Jon... если вы действительно хотите изменить это (вне коробки) поведение Visual Studio и создать свойства auto при реализации интерфейса, вы можете попробовать один из следующих...

  1. Используйте T4 для генерации кода - http://msdn.microsoft.com/en-us/library/bb126445.aspx

  2. Напишите пользовательский плагин для Visual Studio, используя VS SDK, выполните это

Ответ 7

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

public class Asset
{
    public int AssetTrackingID { get; set; }

    public Category AssetCategoryInfo { get; set; }

    public Manufacturer AssetManufacturerInfo { get; set; }

    public ManufacturerModel AssetModelInfo { get; set; }

    public Status AssetStatusInfo { get; set; }

    public EmployeeDetails AssetEmployeeInfo { get; set; }

    public string AssetNumber { get; set; }

    public string SerialNumber { get; set; }

    public DateTime? AcquiredDate { get; set; }

}