এনামগুলিতে কীভাবে এক্সটেনশন পদ্ধতি যুক্ত করা যায়


122

আমার এই এনাম কোডটি রয়েছে:

enum Duration { Day, Week, Month };

আমি কি এই এনুমের জন্য কোনও এক্সটেনশন পদ্ধতি যুক্ত করতে পারি?


1
তুমি কি এটা দেখেছ? stackoverflow.com/questions/2422113/...
badpanda

1
এছাড়াও, এই। stackoverflow.com/questions/276585/...
badpanda

সংক্ষিপ্ত উত্তর, হ্যাঁ এই নির্দিষ্ট ক্ষেত্রে আপনিTimeSpan
Jodrell

1
এনামে এক্সটেনশন পদ্ধতিগুলি ব্যবহার করায় আমার ময়লা লাগে। যা প্রয়োজন তা এনক্যাপুলেট করতে একটি ক্লাস তৈরি করুন। একটি এনাম যথাসম্ভব সহজ রাখুন। আপনার যদি এর সাথে যুক্ত আরও যুক্তিযুক্ত প্রয়োজন হয় তবে একটি সময়কাল শ্রেণি তৈরি করুন যা দিন, সপ্তাহ, মাসকে উদ্ভাসিত করে প্লাসে অন্য কোনও যুক্তি যুক্ত করে যা এক্সটেনশন পদ্ধতিতে থাকত।
জেসন ইভান্স

2
আমি পতাকা গ্রুপগুলির জন্য এনাম এক্সটেনশন পদ্ধতিগুলি পছন্দ করি। আমি উদাহরণস্বরূপ ক্লজ-এ পছন্দ করা Day.IsWorkday()উপর (Day & Days.Workday) > 0সঙ্গে Days.Workdayহিসাবে সংজ্ঞায়িত করা Monday | Tuesday ... | Friday। প্রাক্তনটি আমার মতে আরও স্পষ্ট এবং ঠিক পরেরটি বাস্তবায়িত হয়েছে।
সেবাস্তিয়ান ওয়ার্ক

উত্তর:


114

এই সাইট অনুসারে :

আপনার দলের অন্যান্য লোকেরা প্রকৃতপক্ষে আবিষ্কার এবং ব্যবহার করতে পারে এমন উপায়ে এক্সটেনশন পদ্ধতি বিদ্যমান ক্লাসগুলির জন্য পদ্ধতি লেখার একটি উপায় সরবরাহ করে। দেওয়া হয়েছে যে এনামগুলি অন্য যে কোনও শ্রেণীর মতো ক্লাস, এটি খুব আশ্চর্যজনক হওয়া উচিত নয় যে আপনি তাদের প্রসারিত করতে পারেন, যেমন:

enum Duration { Day, Week, Month };

static class DurationExtensions 
{
  public static DateTime From(this Duration duration, DateTime dateTime) 
  {
    switch (duration) 
    {
      case Day:   return dateTime.AddDays(1);
      case Week:  return dateTime.AddDays(7);
      case Month: return dateTime.AddMonths(1);
      default:    throw new ArgumentOutOfRangeException("duration");
    }
  }
}

আমি মনে করি এনামগুলি সাধারণভাবে সেরা পছন্দ নয় তবে কমপক্ষে এটি আপনাকে কিছুটা স্যুইচকে কেন্দ্রিয় করতে দেয় / যদি পরিচালনা করে এবং কিছু ভাল করে না ফেলে কিছুক্ষণ বিমূর্ত করে ফেলে। মানগুলি সীমার মধ্যে রয়েছে তা পরীক্ষা করে দেখুন।

আপনি আরো পড়তে পারেন এখানে Microsft দুটিই MSDN এ।


আমি বিশ্বাস করি "এনামরা দুষ্ট" মন্তব্যটি অযোগ্য হলেও বাস্তবে এর একটি ভিত্তি রয়েছে। আমি দেখতে পাচ্ছি যে এনামগুলি একটি সমস্যা হতে পারে অতিরিক্ত ব্যবহার করা হয়, কারণ তারা আপনাকে নির্দিষ্ট প্রসঙ্গে এবং আচরণে লক করে দেয়।
এড শোয়েম

1
এন # সিতে চুষে চুষে খায় কারণ এগুলি সংকলন করে এবং চলে:Duration d = 0;
গ্রাহাম

16
Given that enums are classesনা তারা ক্লাস হয় না।
উইঙ্গার সেনডন

1
আমি এই ধরণের এক্সটেনশানটি কেবল তখনই ব্যবহার করি যদি এটি এনাম সম্পর্কে সরাসরি হয়, যেমন সপ্তাহের দিনগুলির মতো এবং এক্সটেনশান পদ্ধতি ইসউইকডে (), ইসউইকেন্ডেডে ()। কিন্তু ক্লাসগুলি আচরণগুলি সজ্জিত করে বোঝানো হয়, সুতরাং যদি এনক্যাপসুলেট করার জন্য অনেকগুলি বা জটিল আচরণ থাকে তবে একটি শ্রেণি সম্ভবত আরও ভাল। যদি এটি সীমাবদ্ধ এবং বেসিক হয় তবে আমি ব্যক্তিগতভাবে এনামগুলিতে এক্সটেনশনগুলি খুঁজে পাই। বেশিরভাগ ডিজাইনের সিদ্ধান্তের মতো পছন্দগুলির (আইএমও) মধ্যে অস্পষ্ট সীমানা রয়েছে। এটি লক্ষণীয় যে এক্সটেনশনগুলি কেবল শীর্ষ স্তরের স্ট্যাটিক ক্লাসগুলিতে করা যেতে পারে, নেস্টেড ক্লাসগুলিতে নয়। আপনার এনাম যদি কোনও শ্রেণীর অংশ হয় তবে আপনাকে একটি বর্গ তৈরি করতে হবে।
ফ্রি টেক্সট

51

আপনি এনামের উদাহরণের চেয়ে এনাম টাইপের সাথে এক্সটেনশন পদ্ধতিও যুক্ত করতে পারেন:

/// <summary> Enum Extension Methods </summary>
/// <typeparam name="T"> type of Enum </typeparam>
public class Enum<T> where T : struct, IConvertible
{
    public static int Count
    {
        get
        {
            if (!typeof(T).IsEnum)
                throw new ArgumentException("T must be an enumerated type");

            return Enum.GetNames(typeof(T)).Length;
        }
    }
}

আপনি উপরে করে এক্সটেনশন পদ্ধতিটি শুরু করতে পারেন:

var result = Enum<Duration>.Count;

এটি সত্যিকারের এক্সটেনশন পদ্ধতি নয়। এটি কেবলমাত্র কাজ করে কারণ এনাম <> সিস্টেমের চেয়ে আলাদা ধরণের n


শ্রেণিটি কি staticতার সমস্ত পদ্ধতি এক্সটেনশনের মতো আচরণ করে তা নিশ্চিত করা যায়?
যতীন সংঘভি

15
ভবিষ্যতের পাঠকদের জন্য: নামের অস্পষ্টতা Enum<T>কিছুটা বিভ্রান্তিকর। ক্লাসটিও ডাকা যেতে পারে এবং EnumUtils<T>পদ্ধতি কলটি সমাধান করতে পারে EnumUtils<Duration>.Count
নমোশেখ

46

অবশ্যই আপনি উদাহরণস্বরূপ বলতে পারেন, আপনি DescriptionAttribueনিজের enumমানগুলি ব্যবহার করতে চান :

using System.ComponentModel.DataAnnotations;

public enum Duration 
{ 
    [Description("Eight hours")]
    Day,

    [Description("Five days")]
    Week,

    [Description("Twenty-one days")] 
    Month 
}

এখন আপনি যেমন কিছু করতে সক্ষম হতে চান:

Duration duration = Duration.Week;
var description = duration.GetDescription(); // will return "Five days"

আপনার এক্সটেনশন পদ্ধতিটি GetDescription()নিম্নরূপ লেখা যেতে পারে:

using System.ComponentModel;
using System.Reflection;

public static string GetDescription(this Enum value)
{
    FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
    if (fieldInfo == null) return null;
    var attribute = (DescriptionAttribute)fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute));
    return attribute.Description;
}

আমি আমার ব্যবহার প্রদর্শনপট্রিবিউট লোকালাইজড গেটডেস্ক্রিপশন ব্যতীত আপনার নমুনাটি ঠিক কী করেছিলেন তার এক্সটেনশন তৈরি করতে চাইছিলাম। চিয়ার্স
জর্জ

এটি একটি দুর্দান্ত বিকল্প, যদিও আমি মনে করি যে নামস্থানটি কেবলমাত্র সিস্টেম.কম্পোনেন্টমোডেল?
টমডস্ট্রি

সুন্দর দৃষ্টিকোণ এবং প্রয়োগকরণের পাশাপাশি এক্সটেনশন কোডটি দেখানোর জন্য আপনাকে ধন্যবাদ। এটি প্রয়োগ করতে: আপনার প্রয়োগের সাথে, আপনি এটিকে এটির মতোও বলতে পারেন: var বিবরণ = সময়কাল W উইক.গেটডেস্ক্রিপশন ();
স্প্যান্সার সুলিভান

31

সমস্ত উত্তর দুর্দান্ত, তবে তারা নির্দিষ্ট ধরণের এনামগুলিতে এক্সটেনশন পদ্ধতি যুক্ত করার বিষয়ে কথা বলছে।

আপনি যদি সমস্ত এনামে একটি পদ্ধতি যুক্ত করতে চান তবে সুস্পষ্ট কাস্টিংয়ের পরিবর্তে বর্তমান মানের কোনও int ফেরত দেওয়ার মতো?

public static class EnumExtensions
{
    public static int ToInt<T>(this T soure) where T : IConvertible//enum
    {
        if (!typeof(T).IsEnum)
            throw new ArgumentException("T must be an enumerated type");

        return (int) (IConvertible) soure;
    }

    //ShawnFeatherly funtion (above answer) but as extention method
    public static int Count<T>(this T soure) where T : IConvertible//enum
    {
        if (!typeof(T).IsEnum)
            throw new ArgumentException("T must be an enumerated type");

        return Enum.GetNames(typeof(T)).Length;
    }
}

পেছনের কৌশলটি IConvertibleহ'ল এমডিএসএন দেখুন ie

শানফীদারলি তার উত্তরের জন্য ধন্যবাদ


1
সেরা উত্তর!
মার্কো আলভেস

পূর্বোক্ত। আমি এক্সটেনশানটি সরাসরি (উদাহরণস্বরূপ MyExtention.DoThing(myvalue)) কল করলে এটি কার্যকর হয় তবে প্রকৃতপক্ষে myvalue.DoThing()
এনামের

1
এফওয়াইআই, সি # 7.3 এখন
এনামকে

7

আপনি objectযে কোনও কিছুর জন্য একটি এক্সটেনশন তৈরি করতে পারেন, এমনকি (যদিও এটি সেরা-অনুশীলন হিসাবে বিবেচিত হয় না )। একটি এক্সটেনশন পদ্ধতিটি কেবল একটি public staticপদ্ধতি হিসাবে বুঝুন । পদ্ধতিগুলিতে আপনার পছন্দ মতো প্যারামিটার-টাইপ ব্যবহার করতে পারেন।

public static class DurationExtensions
{
  public static int CalculateDistanceBetween(this Duration first, Duration last)
  {
    //Do something here
  }
}

5

এমএসডিএন দেখুন ।

public static class Extensions
{
  public static string SomeMethod(this Duration enumValue)
  {
    //Do something here
    return enumValue.ToString("D"); 
  }
}

7
voidএনুমে ফেরতের মান এক ধরণের অদ্ভুত। আমি আরও বাস্তববাদী নমুনা সম্পর্কে চিন্তা করব।
psubsee2003

3
@ psubsee2003 ওপি অবশ্যই তার প্রয়োজন অনুসারে এটি পরিবর্তন করার যথেষ্ট জ্ঞান আছে? নমুনাটি কেন গুরুত্বপূর্ণ, এটি প্রাথমিক প্রশ্নের উত্তর দেওয়ার পক্ষে যথেষ্ট।
লুকহেনারলে

3
আমি কি কেবলমাত্র এমএসডিএন-তে কোড উদাহরণগুলি খুঁজে পাই? বেশিরভাগ সময় আপনার কী চেষ্টা করা হচ্ছে তা বোঝার জন্য কিছু বাস্তব প্রচেষ্টা প্রয়োজন!
সারিবদ্ধ

0

আমরা কেবলমাত্র # # https://github.com/simonmau/enum_ext এর জন্য এনাম এক্সটেনশন করেছি

এটি টাইপসফেনিয়ামের জন্য কেবল একটি বাস্তবায়ন, তবে এটি দুর্দান্ত কাজ করে তাই আমরা ভাগ করে নেওয়ার জন্য একটি প্যাকেজ তৈরি করেছি - এটির সাথে মজা করুন

public sealed class Weekday : TypeSafeNameEnum<Weekday, int>
{
    public static readonly Weekday Monday = new Weekday(1, "--Monday--");
    public static readonly Weekday Tuesday = new Weekday(2, "--Tuesday--");
    public static readonly Weekday Wednesday = new Weekday(3, "--Wednesday--");
    ....

    private Weekday(int id, string name) : base(id, name)
    {
    }

    public string AppendName(string input)
    {
        return $"{Name} {input}";
    }
}

আমি জানি উদাহরণটি এক ধরণের অকেজো, তবে আপনি ধারণাটি পান;)


0

একটি সাধারণ কাজ।

public static class EnumExtensions
{
    public static int ToInt(this Enum payLoad) {

        return ( int ) ( IConvertible ) payLoad;

    }
}

int num = YourEnum.AItem.ToInt();
Console.WriteLine("num : ", num);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.