Как создать автоматически реализованные свойства при реализации интерфейса в классе?
Когда я впервые внедряю интерфейс в класс, я хочу либо 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 при реализации интерфейса, вы можете попробовать один из следующих...
-
Используйте T4 для генерации кода - http://msdn.microsoft.com/en-us/library/bb126445.aspx
-
Напишите пользовательский плагин для 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; }
}