Man kan lägga till functionalitet på en int enligt följande. Extension Methods får väl bara läggas på vanliga metoder? Det tyder ju lite på att MS inte riktigt kände att de ville göra klart det konceptet helt och hållet än. Tills vidare använder jag följande implementation.. Int är en värdetyp, och alltså immutable, den kan inte tilldela ett värde till sej själv, du måste returnera en ny int. Vänta nu... Variabeln som innehåller en int går definitivt att tilldela till. Problemet är egentligen bara att det inte går att få en referens/pekare till den variabeln, och att det inte via kod går att få fram att variabeln "i" är något annat än konstanten "5". Sen stämmer ju förstås det du skriver. Jo, givetvis går det att tilldela till variabeln, klumpigt skivet av mej. Sitter faktiskt precis med just dayofweek fram och tillbaks till integer. Jag har valt att inte göra så mycket snygglösningar, bland annat på grund av detta. Har istället en CalendarFunctions.GetDayOfWeekNumber() >>Inte lika snyggt, men när jag känner att det är mer logiskt eftersom CalendarFunctions förmodligen kommer bytas ut,Extending int
<code>
public static DayOfWeek DayOfWeek(this int theInt)
{
return (DayOfWeek) theInt;
}
</code>
Men jag försöker sätta värdet på int via en DayOfWeek. Följande fungerar ju inte. Och man får inte använda ref för functioner med this.
<code>
public static void DayOfWeek(this int? theInt , DayOfWeek tvalue)
{
theInt = ((int) tvalue);
}
</code>
Tester
<code>
[TestMethod]
public void FridayTest()
{
int? myInt = 5;
DayOfWeek week = myInt.DayOfWeek();
Assert.AreEqual(DayOfWeek.Friday , week);
}
[TestMethod]
public void MondayTest()
{
int? myInt = null;
myInt.DayOfWeek(DayOfWeek.Monday);
// This fails
Assert.AreEqual(myInt, 1);
}
</code>
Någon som vet hur man gör?!Sv: Extending int
Det du skulle kunna göra är att returnera en ny klass, DayOfWeekToInteger, som håller en referens till en int eller bli tilldelad en DayOfWeek. Problemet är att man väl inte får lov att hålla referenser till valueobjects i C#?Sv: Extending int
<code>
[Obsolete("This function is obsolete; use = (int)dayOfWeek")]
public static void DayOfWeek(this int? theInt , DayOfWeek dayOfWeek)
{
throw new Exception("This function is obsolete; use = (int)dayOfWeek");
}
</code>
Fast det kanske inte kan räknas som en optimal lösning :-)Sv:Extending int
Sv: Extending int
Jag tycker nog att den här biten är väldigt inelegant i .net-språken, och är bra mycket mer logisk i, säg, C++.
Det är ju en ganska artificiell uppdelning i "värde" vs "objekt".Sv:Extending int
Det klassiska exemplet är väl String.Replace(), att den inte opererar på strängen, utan returnerar en ny.
I ditt fall hade jag nog gjort extensionmethods enligt Int.ToDayOfWeek() samt DayOfWeek.ToInt() eller något ditåt...Sv: Extending int
Inte lika snyggt, men när jag känner att det är mer logiskt eftersom CalendarFunctions förmodligen kommer bytas ut, och på något sätt känns det bättre att inte vara så hårt kopplad till DayOfWeek (den numrerar ju dagarna "fel" enligt svensk standard).
Sen undviker jag extension methods tills alla inblandade är införstådda med dem också.Sv:Extending int
Jag tycker det är en betydligt snyggare lösning eftersom den inte kräver att du redan har en tilldelad(/nullad) integer för att kunna få fram en veckodag.
Om en extensionmetod helt ignorerar innehållet av "this" parametern så är det ju ett tecken på att något är feldesignat.
[edit]
Såg att förslaget med extensionmetod på enumtypen redan var taget så jag raderar resten av min post :-)