Методы расширения - это просто статические методы, которые реализуют «методы экземпляра», взяв фальшивый указатель «this»:
public static class Extensions
{
public static int ANewFakeInstanceMethod(this SomeObject instance, string someParam)
{
return 0;
}
}
Вы все равно можете вызывать его как статический метод - вот какКомпилятор компилирует ваш код, так или иначе:
var inst = new SomeObject();
int result1 = inst.ANewFakeInstanceMethod("str");
int result2 = Extensions.ANewFakeInstanceMethod(inst, "str");
Если вы не можете получить синтаксис метода расширения, вы все равно можете использовать второй синтаксис, даже если вы уберете this
из определения статического метода:
var inst = new SomeObject();
int result2 = Extensions.ANewFakeInstanceMethod(inst, "str");
public static class Extensions
{
public static int ANewFakeInstanceMethod(SomeObject instance, string someParam)
{
return 0;
}
}
НО
Синтаксис и использование, которое вы пытаетесь реализовать, не имеет смысла.Вы берете существующий DateTime
объект экземпляр (который имеет свои собственные значения для даты и времени) и пытаетесь реализовать новое свойство / метод из этого экземпляра , который будет возвращатьнекоторая несвязанная константа.
Просто используйте статический класс и определите для него статические свойства только для чтения:
public static class KnownDates
{
public static DateTime StSpruffingsDay
{
get
{
return new DateTime(1, 2, 3, 4);
}
}
}
Если это не константа (как, например, она вам нужна длятекущий год), вы должны добавить метод, который занимает год - не пытайтесь вставить его в метод расширения поверх DateTime
, потому что DateTime
воплощает в себе больше, чем год.
public static class KnownDates
{
public static DateTime GetTalkLikeAPirateDay(int year)
{
return new DateTime( // Todo: Calculate the value, based on Sept 19th
}
}
Если вам действительно нужно получить его относительно DateTime
, он все же делает ваш код более понятным, чтобы передать его методу:
var fiveMinutesAgo = DateTime.Now.AddMinutes(-5);
// ...
var arrrr = KnownDates.GetTalkLikeAPirateDay(fiveMinutesAgo.Year);
... Чем он сразу же вызываетсяDateTime
экземпляр:
var fiveMinutesAgo = DateTime.Now.AddMinutes(-5);
// ...
var arrrr = fiveMinutesAgo.GetTalkLikeAPirateDay();