সি # তে জেনেরিক এনামকে কাস্ট করুন


86

C # তে এনামের জন্য কাস্ট ইন্টের মতো তবে আমার এনাম একটি জেনেরিক টাইপ প্যারামিটার। এটি পরিচালনা করার সর্বোত্তম উপায় কী ?

উদাহরণ:

private T ConvertEnum<T>(int i) where T : struct, IConvertible
{
    return (T)i;
}

সংকলক ত্রুটি উত্পন্ন করে Cannot convert type 'int' to 'T'

সম্পূর্ণ কোডটি নিম্নরূপ, যেখানে মানটি ইনট বা নাল ধারণ করতে পারে।

private int? TryParseInt(string value)
{
    var i = 0;
    if (!int.TryParse(value, out i))
    {
        return null;
    }
    return i;
}

private T? TryParseEnum<T>(string value) where T : struct, IConvertible
{
    var i = TryParseInt(value);
    if (!i.HasValue)
    {
        return null;
    }

    return (T)i.Value;
}

stackoverflow.com/questions/2745320/… - সাহায্য করতে পারে?
সানি

স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 1331739/… এর সর্বশেষ উত্তর আপনি যা চান তার কাছাকাছি। যদিও এটি এখনও চালাক নয়। আমি এর জন্য প্রতিবিম্ব ব্যবহার করার প্রবণতা রাখি, আপনি কোডটিকে আরও শক্তিশালী করতে পারেন। আমার মতামতটি জেনেরিকের সাথে গোলমাল করার পক্ষে কাঠামো যথেষ্ট পরিমাণে পুনরুদ্ধারযোগ্য নয়।
টনি হপকিনসন

উত্তর:


121

সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি হ'ল একটি কাস্ট যোগ করে সংকলকটির হাত জোর করা object

return (T)(object)i.Value;

12
আপনি যদি বক্সিং পছন্দ না করেন: সি-শার্প-নন-বক্সিং-রূপান্তর-জেনেরিক-
এনাম

4
আমরা এনএম তে কাস্টিং দিচ্ছি, তাই আপনার লিঙ্ক প্রশ্নের সাথে উল্টো নয়। এছাড়াও, সেই প্রশ্নের কোনও সমাধান নেই।
ম্যাটটিএসপি

আপনি এনাম মানগুলি সহ একটি স্ট্যাটিক অ্যারেও বরাদ্দ করতে পারেন এবং তারপরে সঠিক এনাম পুনরুদ্ধারের জন্য সূচীতে পাস করতে পারেন। এটি কোনও ধরণের ingালাই করা সংরক্ষণ করে। উদাহরণ (কেবল লাইন 11,14, এবং 34 এই ধারণার সাথে প্রাসঙ্গিক): পেস্টবিন.
com

21

আপনি এটির জন্য ব্যবহার করতে সক্ষম হবেন Enum.Parse:

return (T)Enum.Parse(typeof(T), i.Value.ToString(), true);

এই নিবন্ধটি প্রসারিত পদ্ধতিগুলির জন্য জেনেরিক এনামগুলি পার্সিং সম্পর্কে আলোচনা করেছে:


@ গুভান্তে: আমি মনে করি আমি আমার উদাহরণে মানটিকে স্ট্রিংয়ে রূপান্তর করেছি। আপনি কি এটিকে সমস্যার কারণ বলে মনে করছেন?
জেমস জনসন

16

এখানে একটি খুব দ্রুত সমাধান যা রানটাইম স্থিতিশীল জেনেরিক ক্লাসের একাধিক উদাহরণ তৈরি করে ab আপনার অভ্যন্তরীণ অপ্টিমাইজেশান ভূতগুলি মুক্ত করুন!

আপনি যখন জেনেরিক ফ্যাশনে একটি স্ট্রিম থেকে এনামস পড়ছেন তখন এটি সত্যিই জ্বলে ওঠে। একটি বহিরাগত শ্রেণীর সাথে একত্রিত করুন যা এনামের অন্তর্নিহিত ধরণের এবং বিটকনভার্টারটিকে দুর্দান্তভাবে ছাড়ানোর জন্য ক্যাশে করে।

void Main() 
{
    Console.WriteLine("Cast (reference): {0}", (TestEnum)5);
    Console.WriteLine("EnumConverter: {0}", EnumConverter<TestEnum>.Convert(5));
    Console.WriteLine("Enum.ToObject: {0}", Enum.ToObject(typeof(TestEnum), 5));

    int iterations = 1000 * 1000 * 100;
    Measure(iterations, "Cast (reference)", () => { var t = (TestEnum)5; });
    Measure(iterations, "EnumConverter", () => EnumConverter<TestEnum>.Convert(5));
    Measure(iterations, "Enum.ToObject", () => Enum.ToObject(typeof(TestEnum), 5));
}

static class EnumConverter<TEnum> where TEnum : struct, IConvertible
{
    public static readonly Func<long, TEnum> Convert = GenerateConverter();

    static Func<long, TEnum> GenerateConverter()
    {
        var parameter = Expression.Parameter(typeof(long));
        var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
            Expression.Convert(parameter, typeof(TEnum)),
            parameter);
        return dynamicMethod.Compile();
    }
}

enum TestEnum 
{
    Value = 5
}

static void Measure(int repetitions, string what, Action action)
{
    action();

    var total = Stopwatch.StartNew();
    for (int i = 0; i < repetitions; i++)
    {
        action();
    }
    Console.WriteLine("{0}: {1}", what, total.Elapsed);
}

কোর i7-3740QM- এ অপটিমাইজেশন সক্ষম সহ ফলাফলগুলি সক্ষম হয়েছে:

Cast (reference): Value
EnumConverter: Value
Enum.ToObject: Value
Cast (reference): 00:00:00.3175615
EnumConverter: 00:00:00.4335949
Enum.ToObject: 00:00:14.3396366

4
এটা সত্যিই দুর্দান্ত, ধন্যবাদ। আপনি ব্যবহার করতে পছন্দ করতে পারেন Expression.ConvertCheckedপরিবর্তে যদিও, তাই একটি ইন enum টাইপ এর পরিসীমা ফলাফল যে সাংখ্যিক ওভারফ্লো OverflowException
ড্রয় নোকস

আপনার মাইলেজটি পৃথক হতে পারে, আমি ট্রাই.ডট.নেট (ব্লেজার) এ কোডটি চালিয়েছি এবং সেখানে এনামকমভার্টার <T> বিকল্পগুলির চেয়ে অনেক ধীর গতিতে রয়েছে। প্রথমে আপত্তি করার জন্য কাস্টিং সরাসরি কাস্টের চেয়ে প্রায় 6 গুণ ধীর ছিল, তবে অন্যান্য বিকল্পগুলির চেয়ে এখনও অনেক ভাল।
হারমান



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.