আমি কিছুক্ষণ আগে একটি সেট এক্সটেনশন পদ্ধতি লিখেছিলাম যা বিভিন্ন ধরণের Enum
এস এর জন্য কাজ করে । আপনি যেটি সাধন করতে চেষ্টা করছেন তার জন্য বিশেষত একটি কাজ Enum
করে FlagsAttribute
এবং পাশাপাশি Enum
বিভিন্ন অন্তর্নিহিত ধরণের সাথে পরিচালনা করে।
public static tEnum SetFlags<tEnum>(this Enum e, tEnum flags, bool set, bool typeCheck = true) where tEnum : IComparable
{
if (typeCheck)
{
if (e.GetType() != flags.GetType())
throw new ArgumentException("Argument is not the same type as this instance.", "flags");
}
var flagsUnderlyingType = Enum.GetUnderlyingType(typeof(tEnum));
var firstNum = Convert.ToUInt32(e);
var secondNum = Convert.ToUInt32(flags);
if (set)
firstNum |= secondNum;
else
firstNum &= ~secondNum;
var newValue = (tEnum)Convert.ChangeType(firstNum, flagsUnderlyingType);
if (!typeCheck)
{
var values = Enum.GetValues(typeof(tEnum));
var lastValue = (tEnum)values.GetValue(values.Length - 1);
if (newValue.CompareTo(lastValue) > 0)
return lastValue;
}
return newValue;
}
সেখান থেকে আপনি আরও নির্দিষ্ট নির্দিষ্ট এক্সটেনশন পদ্ধতি যুক্ত করতে পারেন।
public static tEnum AddFlags<tEnum>(this Enum e, tEnum flags) where tEnum : IComparable
{
SetFlags(e, flags, true);
}
public static tEnum RemoveFlags<tEnum>(this Enum e, tEnum flags) where tEnum : IComparable
{
SetFlags(e, flags, false);
}
আপনি যেভাবে Enum
চেষ্টা করার চেষ্টা করছেন তার মতো এটির ধরণের পরিবর্তন হবে।
public static tEnum ChangeType<tEnum>(this Enum e) where tEnum : IComparable
{
return SetFlags(e, default(tEnum), true, false);
}
সতর্কতা অবলম্বন করুন, যদিও আপনি এই পদ্ধতিটি ব্যবহার করে যে কোনও Enum
এবং যে কোনওর মধ্যে রূপান্তর করতে পারেন Enum
, এমনকি পতাকা নেই those উদাহরণ স্বরূপ:
public enum Turtle
{
None = 0,
Pink,
Green,
Blue,
Black,
Yellow
}
[Flags]
public enum WriteAccess : short
{
None = 0,
Read = 1,
Write = 2,
ReadWrite = 3
}
static void Main(string[] args)
{
WriteAccess access = WriteAccess.ReadWrite;
Turtle turtle = access.ChangeType<Turtle>();
}
ভেরিয়েবলের মান turtle
হবে Turtle.Blue
।
তবে Enum
এই পদ্ধতিটি ব্যবহার করে অপরিজ্ঞাত মান থেকে সুরক্ষা পাওয়া যায় । এই ক্ষেত্রে:
static void Main(string[] args)
{
Turtle turtle = Turtle.Yellow;
WriteAccess access = turtle.ChangeType<WriteAccess>();
}
এই ক্ষেত্রে, access
সেট করা হবে WriteAccess.ReadWrite
, যেহেতুWriteAccess
Enum
সর্বোচ্চ মূল্য 3 হয়।
Enum
এর সাথে এর মিশ্রণের আর একটি পার্শ্বপ্রতিক্রিয়া FlagsAttribute
এবং এটি ব্যতীত হ'ল রূপান্তর প্রক্রিয়াটি তাদের মানগুলির মধ্যে 1 থেকে 1 টি মিলবে না।
public enum Letters
{
None = 0,
A,
B,
C,
D,
E,
F,
G,
H
}
[Flags]
public enum Flavors
{
None = 0,
Cherry = 1,
Grape = 2,
Orange = 4,
Peach = 8
}
static void Main(string[] args)
{
Flavors flavors = Flavors.Peach;
Letters letters = flavors.ChangeType<Letters>();
}
এই ক্ষেত্রে, letters
একটি মান থাকবে Letters.H
পরিবর্তে Letters.D
, যেহেতু সমর্থন মান Flavors.Peach
8. এছাড়াও থেকে একটি রূপান্তর, Flavors.Cherry | Flavors.Grape
করতে Letters
উত্পাদ হবে Letters.C
, যা unintuitive মনে করতে পারেন।