Enum, tapi String

2 views
Skip to first unread message

Ikhwan Hayat

unread,
Feb 23, 2009, 8:09:00 PM2/23/09
to ALTNETMY
Assalamu'alaikum,

Dalam C#, biasanya, utk value yg hanya boleh dipilih dari satu set of
values, kita pakai `enum`. E.g:

class Student
{
public StudentStatus Status { get; set; }
}

enum StudentStatus
{
Active,
Suspended,
Dismissed
}

Tapi, kalau value tu *bukan* int, mungkin memerlukan string supaya
data lebih mudah dibaca, mcm mana nak buat? Contohnya,

class Student
{
public string Status { get; set; }
}

Value utk Student.Status mestilah sama ada "A", "S", atau "D" utk
Active, Suspended, atau Dismissed.

Macam mana cara nak buat supaya dua kekangan dibawah masih dihormati:
1) Value yg boleh di set *mesti* salah satu dari nilai yang dibenarkan
(Active, Suspended atau Dismissed).
2) Value yang disimpan *mesti* nilai yang sebenar yang tersebut (A, S,
atau D).

Macam mana korang selalu buat?

Rushdan Mamat

unread,
Feb 23, 2009, 8:40:51 PM2/23/09
to altn...@googlegroups.com
pakai cam ni tak leh ke

enum StudentStatus
{
   Active = "A",
   Suspended = "S",
   Dismissed ="D"
}

2009/2/24 Ikhwan Hayat <ikhwa...@gmail.com>

ron

unread,
Feb 23, 2009, 8:45:15 PM2/23/09
to altn...@googlegroups.com
Aku pon buat cara macam Rushdan

2009/2/24 Rushdan Mamat <rushda...@gmail.com>

ron

unread,
Feb 23, 2009, 8:50:01 PM2/23/09
to altn...@googlegroups.com
public enum StudentStatus : String
{
   /// <summary/>
   Active = "A",
   /// <summary/>
   Suspended = "S",
   /// <summary/>
   Dismissed ="D"
}



2009/2/24 ron <raja...@gmail.com>

Ikhwan Hayat

unread,
Feb 23, 2009, 8:55:50 PM2/23/09
to altn...@googlegroups.com
2009/2/24 ron <raja...@gmail.com>:

> public enum StudentStatus : String
> {
> /// <summary/>
> Active = "A",
> /// <summary/>
> Suspended = "S",
> /// <summary/>
> Dismissed ="D"
> }
>

Betul ke korang ni...

Dari MSDN <msdn.microsoft.com/en-us/library/sbbt4032(VS.80).aspx>

"Every enumeration type has an underlying type, which can be any
integral type except char"

Aku try run code ron ni, dapat compile error:

"Type byte, sbyte, short, ushort, int, uint, long, or ulong expected"

ron

unread,
Feb 23, 2009, 8:57:35 PM2/23/09
to altn...@googlegroups.com
hehe aku wat pakai logik je, tak test pon, dah lama tak sentuh enum

ron

unread,
Feb 23, 2009, 8:59:18 PM2/23/09
to altn...@googlegroups.com

Ikhwan Hayat

unread,
Feb 23, 2009, 9:05:26 PM2/23/09
to altn...@googlegroups.com
2009/2/24 ron <raja...@gmail.com>:

> hehe aku wat pakai logik je, tak test pon, dah lama tak sentuh enum

Hoho.. tak pakai enum? Living live dangerously free and wild :D

Actually, ni yg aku selalu buat:

class Student
{
///<summary>Value must be from Student.Statuses</summary>


public string Status { get; set; }

public class Statuses
{
public const string Active = "A";
public const string Suspended = "S";
public const string Dismissed = "D";
}
}

var s = new Student();
s.Status = Student.Statuses.Active;

Melalui cara ni, kita boleh dapat intellisense support utk values yg
*mungkin* bagi Status.

Tapi tak boleh enforce compile time check kalau dia bagi string lain. E.g:

Tak produce error bila s.Status = "X";

Dan tak comply pun dgn dua-dua kekangan tadi.

Ikhwan Hayat

unread,
Feb 23, 2009, 9:15:36 PM2/23/09
to altn...@googlegroups.com
2009/2/24 ron <raja...@gmail.com>:

Memang pernah nampak solution mcm ni sebelum ni.. Tapi tak comply
kekangan yg kedua:

2) Value yang disimpan *mesti* nilai yang sebenar yang tersebut (A, S,
atau D).

Sebabnya, kadang2 penting utk simpan value yg *bermakna* dalam
database. Dlm contoh ni, sekali imbas dah tau Student tu (A)active,
(S)suspended, atau (D)ismissed. Kalau kita simpan enum, atau
underlying typenya yg biasanya int, kita kena tahu 0 adalah active, 1
adalah suspended, 2 adalah dismissed. Leceh beb.

Baru terfikir, boleh ke buat something yg mcm ni, guna Attribute maybe?

[AllowedValues("A", "S", D")]
string Status { get; set; }

Macam design by contract?

ron

unread,
Feb 23, 2009, 9:36:33 PM2/23/09
to altn...@googlegroups.com
Cara kalau guna attribute, aku try boleh je dpt value string


    enum StudentStatus : byte
    {

        [Description("A")]
        Active,
       
        [Description("S")]
        Suspended,
       
        [Description("D")]
        Dismissed

    }

    class Description : Attribute
    {

        public string Text;

        public Description(string text)
        {

            Text = text;

        }

    }

    class Program
    {

        static string GetDescription(Enum en)
        {

            Type type = en.GetType();

            MemberInfo[] memInfo = type.GetMember(en.ToString());

            if (memInfo != null && memInfo.Length > 0)
            {

                object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description),
                false);

                if (attrs != null && attrs.Length > 0)

                    return ((Description)attrs[0]).Text;

            }

            return en.ToString();

        }

        static void Main(string[] args)
        {

            StudentStatus status1 = StudentStatus.Active;
            StudentStatus status2 = StudentStatus.Suspended;
            StudentStatus status3 = StudentStatus.Dismissed;

            Console.WriteLine(GetDescription(status1));
            Console.WriteLine(GetDescription(status2));
            Console.WriteLine(GetDescription(status3));

        }

    }





2009/2/24 Ikhwan Hayat <ikhwa...@gmail.com>

Ikhwan Hayat

unread,
Feb 24, 2009, 12:26:15 AM2/24/09
to ALTNETMY
Too much complexity to just store a simple value? :)

Any simple and elegant solution? Ok, at least maybe some extra code
upfront utk utility class/attributes is allowed, tapi kalau boleh masa
nak guna tu simple je.

Mungkin tak perlu pakai enum pun, tapi 2 syarat tadi tu kena ikut.

Ikhwan Hayat

unread,
Feb 24, 2009, 6:19:06 AM2/24/09
to ALTNETMY

On Feb 24, 10:15 am, Ikhwan Hayat <ikhwanha...@gmail.com> wrote:
> [AllowedValues("A", "S", D")]
> string Status { get; set; }
>
> Macam design by contract?

Ingat nak cuba buat mcm ni

class Student
{
[AllowedValues("A", "S", "D")]
string Status { get; set; }
}

Buat satu class AllowValuesAttribute yg boleh di attach ke properties
(atau mungkin method parameters), yang mana in compile time, compiler
akan check apa value yg di set ke Status tu sama ada allowed ke tak.

Tapi nak buat attribute mcm ni susah. Ini dah masuk mcm Aspect
Oriented Programming la plak. Lagi la payah :P

Kena la tunggu C# ada feature utk enum with underlaying type string.
Reply all
Reply to author
Forward
0 new messages