উপরের সমাধানগুলি [Flags]
পরিস্থিতিগুলি মোকাবেলা করে না ।
নীচে আমার সমাধানে কিছু পারফরম্যান্স সমস্যা থাকতে পারে (আমি নিশ্চিত যে বিভিন্ন উপায়ে কেউ অনুকূলিত করতে পারে) তবে মূলত এটি সর্বদা প্রমাণ করবে যে এনাম মানটি বৈধ কিনা ।
এটি তিনটি অনুমানের উপর নির্ভর করে:
- সি # তে এনাম মানগুলি কেবলমাত্র অনুমোদিত
int
, অন্য কিছু নয় absolutely
- সি # তে এনাম নামগুলি বর্ণমালার অক্ষর দিয়ে শুরু হওয়া উচিত
- কোনও বৈধ এনাম নাম বিয়োগ চিহ্ন সহ হতে পারে না:
-
ToString()
কোনও এনামের সাথে কল করা কোনও int
মান (পতাকা বা না) মিললে মানটি দেয় returns যদি অনুমোদিত এনুম মানটি মিলে যায় তবে এটি ম্যাচের নাম (এস) প্রিন্ট করবে।
তাই:
[Flags]
enum WithFlags
{
First = 1,
Second = 2,
Third = 4,
Fourth = 8
}
((WithFlags)2).ToString() ==> "Second"
((WithFlags)(2 + 4)).ToString() ==> "Second, Third"
((WithFlags)20).ToString() ==> "20"
এই দুটি নিয়ম মাথায় রেখে আমরা ধরে নিতে পারি যে .NET ফ্রেমওয়ার্কটি যদি সঠিকভাবে কাজ করে যে কোনও বৈধ এনামের ToString()
পদ্ধতিতে যে কোনও কল করার ফলে এটির প্রথম অক্ষর হিসাবে বর্ণানুক্রমিক অক্ষর রয়েছে এমন কিছু ঘটবে:
public static bool IsValid<TEnum>(this TEnum enumValue)
where TEnum : struct
{
var firstChar = enumValue.ToString()[0];
return (firstChar < '0' || firstChar > '9') && firstChar != '-';
}
একে একে "হ্যাক" বলা যেতে পারে তবে সুবিধাগুলি হ'ল মাইক্রোসফ্টের নিজস্ব প্রয়োগ Enum
এবং সি # মানদণ্ডের উপর নির্ভর করে আপনি নিজের সম্ভাব্য বগি কোড বা চেকগুলিতে নির্ভর করছেন না। এমন পরিস্থিতিতে যেখানে পারফরম্যান্স ব্যতিক্রমীভাবে সমালোচনামূলক নয়, এটি প্রচুর বাজে switch
বিবৃতি বা অন্যান্য চেক সংরক্ষণ করবে !
সম্পাদন করা
আমার আসল বাস্তবায়ন নেতিবাচক মানগুলিকে সমর্থন করে না বলে উল্লেখ করার জন্য @ চেসেমেডালিয়নকে ধন্যবাদ। এটি প্রতিকার এবং পরীক্ষা প্রদান করা হয়েছে।
এবং পরীক্ষাগুলি এটি ব্যাক আপ করার জন্য:
[TestClass]
public class EnumExtensionsTests
{
[Flags]
enum WithFlags
{
First = 1,
Second = 2,
Third = 4,
Fourth = 8
}
enum WithoutFlags
{
First = 1,
Second = 22,
Third = 55,
Fourth = 13,
Fifth = 127
}
enum WithoutNumbers
{
First, // 1
Second, // 2
Third, // 3
Fourth // 4
}
enum WithoutFirstNumberAssigned
{
First = 7,
Second, // 8
Third, // 9
Fourth // 10
}
enum WithNagativeNumbers
{
First = -7,
Second = -8,
Third = -9,
Fourth = -10
}
[TestMethod]
public void IsValidEnumTests()
{
Assert.IsTrue(((WithFlags)(1 | 4)).IsValid());
Assert.IsTrue(((WithFlags)(1 | 4)).IsValid());
Assert.IsTrue(((WithFlags)(1 | 4 | 2)).IsValid());
Assert.IsTrue(((WithFlags)(2)).IsValid());
Assert.IsTrue(((WithFlags)(3)).IsValid());
Assert.IsTrue(((WithFlags)(1 + 2 + 4 + 8)).IsValid());
Assert.IsFalse(((WithFlags)(16)).IsValid());
Assert.IsFalse(((WithFlags)(17)).IsValid());
Assert.IsFalse(((WithFlags)(18)).IsValid());
Assert.IsFalse(((WithFlags)(0)).IsValid());
Assert.IsTrue(((WithoutFlags)1).IsValid());
Assert.IsTrue(((WithoutFlags)22).IsValid());
Assert.IsTrue(((WithoutFlags)(53 | 6)).IsValid()); // Will end up being Third
Assert.IsTrue(((WithoutFlags)(22 | 25 | 99)).IsValid()); // Will end up being Fifth
Assert.IsTrue(((WithoutFlags)55).IsValid());
Assert.IsTrue(((WithoutFlags)127).IsValid());
Assert.IsFalse(((WithoutFlags)48).IsValid());
Assert.IsFalse(((WithoutFlags)50).IsValid());
Assert.IsFalse(((WithoutFlags)(1 | 22)).IsValid());
Assert.IsFalse(((WithoutFlags)(9 | 27 | 4)).IsValid());
Assert.IsTrue(((WithoutNumbers)0).IsValid());
Assert.IsTrue(((WithoutNumbers)1).IsValid());
Assert.IsTrue(((WithoutNumbers)2).IsValid());
Assert.IsTrue(((WithoutNumbers)3).IsValid());
Assert.IsTrue(((WithoutNumbers)(1 | 2)).IsValid()); // Will end up being Third
Assert.IsTrue(((WithoutNumbers)(1 + 2)).IsValid()); // Will end up being Third
Assert.IsFalse(((WithoutNumbers)4).IsValid());
Assert.IsFalse(((WithoutNumbers)5).IsValid());
Assert.IsFalse(((WithoutNumbers)25).IsValid());
Assert.IsFalse(((WithoutNumbers)(1 + 2 + 3)).IsValid());
Assert.IsTrue(((WithoutFirstNumberAssigned)7).IsValid());
Assert.IsTrue(((WithoutFirstNumberAssigned)8).IsValid());
Assert.IsTrue(((WithoutFirstNumberAssigned)9).IsValid());
Assert.IsTrue(((WithoutFirstNumberAssigned)10).IsValid());
Assert.IsFalse(((WithoutFirstNumberAssigned)11).IsValid());
Assert.IsFalse(((WithoutFirstNumberAssigned)6).IsValid());
Assert.IsFalse(((WithoutFirstNumberAssigned)(7 | 9)).IsValid());
Assert.IsFalse(((WithoutFirstNumberAssigned)(8 + 10)).IsValid());
Assert.IsTrue(((WithNagativeNumbers)(-7)).IsValid());
Assert.IsTrue(((WithNagativeNumbers)(-8)).IsValid());
Assert.IsTrue(((WithNagativeNumbers)(-9)).IsValid());
Assert.IsTrue(((WithNagativeNumbers)(-10)).IsValid());
Assert.IsFalse(((WithNagativeNumbers)(-11)).IsValid());
Assert.IsFalse(((WithNagativeNumbers)(7)).IsValid());
Assert.IsFalse(((WithNagativeNumbers)(8)).IsValid());
}
}