সি # এর কি এক্সটেনশন বৈশিষ্ট্য রয়েছে?


768

সি # এর কি এক্সটেনশন বৈশিষ্ট্য রয়েছে?

উদাহরণস্বরূপ, আমি একটি এক্সটেনশন সম্পত্তি যোগ করতে পারেন DateTimeFormatInfoনামক ShortDateLongTimeFormatযা ফিরে আসবে ShortDatePattern + " " + LongTimePattern?


14
আমি Nullable <T> অন ইস্নুল নামে একটি এক্সটেনশন পদ্ধতি যুক্ত করতে চেয়েছিলাম যা কেবল ফিরে আসবে! HasValue। .আইসনুল () অবশ্যই কম সুন্দর .আইসনুল
কেন


2
আমি এটি জাভা এর নকল করতে চেয়েছিলাম enumযার বৈশিষ্ট্য এবং পদ্ধতি থাকতে পারে। সি # এর enumবৈশিষ্ট্য বা পদ্ধতি থাকতে পারে না তবে আপনি সেগুলিতে এক্সটেনশন পদ্ধতি তৈরি করতে পারেন । এই প্রশ্নটি আমার পক্ষে কার্যকর ছিল এবং এটি বন্ধ করা উচিত নয়।
ইয়ান ম্যাকলেয়ার্ড

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

2
একটি তৈরি করা উচিত
রুটেল

উত্তর:


364

মুহুর্তের জন্য এটি এখনও রোজলিন সংকলক দ্বারা বাক্সের বাইরে সমর্থিত নয় ...

এখন অবধি এক্সটেনশন বৈশিষ্ট্যগুলি সি # স্ট্যান্ডার্ডের পূর্ববর্তী সংস্করণগুলিতে অন্তর্ভুক্ত করার মতো যথেষ্ট মূল্যবান হিসাবে দেখা যায় নি। সি # 7 এবং সি # 8.0 এটিকে প্রস্তাবের চ্যাম্পিয়ন হিসাবে দেখেছে তবে এটি এখনও প্রকাশ করা হয়নি, বেশিরভাগ কারণ ইতিমধ্যে বাস্তবায়ন থাকলেও তারা শুরু থেকেই এটিকে তৈরি করতে চায়।

তবে এটি হবে ...

সি # 7 কাজের তালিকায় একটি এক্সটেনশন সদস্য আইটেম রয়েছে যাতে এটি অদূর ভবিষ্যতে সমর্থিত হতে পারে। সম্পর্কিত আইটেমের আওতায় গিথুব-এ এক্সটেনশন সম্পত্তির বর্তমান অবস্থা পাওয়া যাবে ।

তবে আরও একটি আশাব্যঞ্জক বিষয় রয়েছে যা বিশেষত সম্পত্তি এবং স্থির শ্রেণি বা এমনকি ক্ষেত্রগুলিকে কেন্দ্র করে "সমস্ত কিছু প্রসারিত করুন "

তবুও আপনি একটি workaround ব্যবহার করতে পারেন

এই নিবন্ধে উল্লিখিত হিসাবে , আপনি TypeDescriptorরানটাইমের সময় কোনও অবজেক্টের উদাহরণগুলিতে একটি বৈশিষ্ট্য সংযুক্ত করার জন্য ক্ষমতাটি ব্যবহার করতে পারেন । তবে এটি স্ট্যান্ডার্ড বৈশিষ্ট্যের সিনট্যাক্স ব্যবহার করছে না।
এটি কেবল সিনট্যাকটিক চিনির থেকে কিছুটা আলাদা যা বর্ধিত সম্পত্তি
string Data(this MyClass instance)যেমন বর্ধনের পদ্ধতির জন্য একটি উপাধার
string GetData(this MyClass instance)যেমন শ্রেণিতে ডেটা সংরক্ষণ করে তার সংজ্ঞা দেওয়ার সম্ভাবনা যুক্ত করে ।

আমি আশা করি যে সি # 7 সম্পূর্ণ বৈশিষ্ট্যযুক্ত এক্সটেনশন সবকিছু সরবরাহ করবে (বৈশিষ্ট্য এবং ক্ষেত্র), তবে সেই সময়ে, কেবল সময়ই বলে দেবে।

এবং আগামীকালের সফ্টওয়্যারটি সম্প্রদায় থেকে আসবে বলে অবদান নির্দ্বিধায় করুন।

আপডেট: আগস্ট 2016

যেমন ডটনেট টিম সি # 7.0 তে নতুন কী প্রকাশ করেছে এবং ম্যাডস টোরজেনসেনের একটি মন্তব্য থেকে :

এক্সটেনশান বৈশিষ্ট্য: গ্রীষ্মে আমাদের অন্যান্য ধরণের এক্সটেনশন সদস্যদের পাশাপাশি একটি (উজ্জ্বল!) ইন্টার্ন প্রয়োগ করা হয়েছিল। আমরা এতে আগ্রহী রয়েছি, তবে এটি একটি বড় পরিবর্তন এবং আমাদের আত্মবিশ্বাস বোধ করা দরকার যে এটি উপযুক্ত।

দেখে মনে হচ্ছে এক্সটেনশন বৈশিষ্ট্য এবং অন্যান্য সদস্যরা এখনও রোজলিনের ভবিষ্যতে প্রকাশের জন্য অন্তর্ভুক্ত থাকার জন্য ভাল প্রার্থী, তবে সম্ভবত .0.০ নয়।

আপডেট: মে 2017

এক্সটেনশন সদস্যরা সমস্ত বন্ধ ইস্যুটির ডুপ্লিকেট হিসাবেবন্ধ হয়ে গেছে যা খুব বন্ধ। মূল আলোচনাটি প্রকৃত অর্থে প্রকারের এক্সটেনসিবিলিটি সম্পর্কে ছিল। বৈশিষ্ট্যটি এখন একটি প্রস্তাব হিসাবে এখানে ট্র্যাক করা হয়েছে এবং 7.0 মাইলফলক থেকে সরানো হয়েছে।

আপডেট: আগস্ট, 2017 - সি # 8.0 প্রস্তাবিত বৈশিষ্ট্য

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

public interface IEmployee 
{
    public decimal Salary { get; set; }
}

public class Employee
{
    public decimal Salary { get; set; }
}

public extension MyPersonExtension extends Person : IEmployee
{
    private static readonly ConditionalWeakTable<Person, Employee> _employees = 
        new ConditionalWeakTable<Person, Employee>();


    public decimal Salary
    {
        get 
        {
            // `this` is the instance of Person
            return _employees.GetOrCreate(this).Salary; 
        }
        set 
        {
            Employee employee = null;
            if (!_employees.TryGetValue(this, out employee)
            {
                employee = _employees.GetOrCreate(this);
            }
            employee.Salary = value;
        }
    }
}

IEmployee person = new Person();
var salary = person.Salary;

আংশিক শ্রেণীর মতো, তবে পৃথক সমাবেশে পৃথক শ্রেণি / টাইপ হিসাবে সংকলিত। দ্রষ্টব্য আপনি এইভাবে স্থির সদস্য এবং অপারেটরগুলি যুক্ত করতে সক্ষম হবেন। ম্যাডস টোরজেনসেন পডকাস্টে উল্লিখিত হিসাবে , এক্সটেনশনের কোনও রাজ্য থাকবে না (সুতরাং এটি শ্রেণিতে ব্যক্তিগত উদাহরণ সদস্যদের যোগ করতে পারে না) যার অর্থ আপনি উদাহরণের সাথে যুক্ত ব্যক্তিগত তথ্য ডেটা যুক্ত করতে পারবেন না । এর জন্য অনুরোধ করার কারণটি হ'ল অভ্যন্তরীণ অভিধানগুলি পরিচালনা করা বোঝায় এবং এটি কঠিন হতে পারে (মেমরি পরিচালনা, ইত্যাদি ...)। এর জন্য, আপনি এখনও পূর্বে বর্ণিত TypeDescriptor/ ConditionalWeakTableকৌশলটি ব্যবহার করতে পারেন এবং সম্পত্তি সম্প্রসারণ সহ, এটি একটি দুর্দান্ত সম্পত্তির আওতায় লুকিয়ে রাখেন।

সিনট্যাক্স এখনও এই বিষয় হিসাবে বোঝা হিসাবে পরিবর্তন সাপেক্ষে । উদাহরণস্বরূপ, এর extendsদ্বারা প্রতিস্থাপন করা যেতে পারে forযা কিছুজন আরও প্রাকৃতিক এবং কম জাভা সম্পর্কিত অনুভব করতে পারে।

ডিসেম্বর 2018 আপডেট করুন - ভূমিকা, এক্সটেনশান এবং স্থির ইন্টারফেস সদস্য

এই গিটহাবের টিকিটের সমাপ্তি হিসাবে ব্যাখ্যা করা কিছু ত্রুটিগুলির কারণে এক্সটেনশান সবকিছু এটিকে সি # 8.0 তে পরিণত করেনি । সুতরাং, নকশা উন্নত করার জন্য একটি অনুসন্ধান ছিল। এখানে , ম্যাডস টরজেনসেন ব্যাখ্যা ও ভূমিকা কী কী এবং কীভাবে সেগুলি পৃথক করে তা ব্যাখ্যা করে :

ভূমিকা কোনও প্রদত্ত প্রকারের নির্দিষ্ট মানগুলিতে ইন্টারফেস প্রয়োগ করতে দেয়। এক্সটেনশানগুলি কোডের একটি নির্দিষ্ট অঞ্চলে প্রদত্ত প্রকারের সমস্ত মানগুলিতে ইন্টারফেস প্রয়োগ করতে দেয়।

এটি দুটি ব্যবহারের ক্ষেত্রে পূর্ববর্তী প্রস্তাবের বিভাজনে দেখা যায়। এক্সটেনশন জন্য নতুন বাক্য গঠন এই মত হবে:

public extension ULongEnumerable of ulong
{
    public IEnumerator<byte> GetEnumerator()
    {
        for (int i = sizeof(ulong); i > 0; i--)
        {
            yield return unchecked((byte)(this >> (i-1)*8));
        }
    }
}

তাহলে আপনি এটি করতে সক্ষম হবেন:

foreach (byte b in 0x_3A_9E_F1_C5_DA_F7_30_16ul)
{
    WriteLine($"{e.Current:X}");
}

এবং একটি স্ট্যাটিক ইন্টারফেসের জন্য :

public interface IMonoid<T> where T : IMonoid<T>
{
    static T operator +(T t1, T t2);
    static T Zero { get; }
}

এতে একটি এক্সটেনশন সম্পত্তি যুক্ত করুন intএবং এর intমতো আচরণ করুন IMonoid<int>:

public extension IntMonoid of int : IMonoid<int>
{
    public static int Zero => 0;
}

57
এটি স্ট্যাকএক্সচেঞ্জে আমি অনুসরণ করা সবচেয়ে দরকারী উত্তরগুলির মধ্যে একটি। স্থিতির সাথে ধারাবাহিকভাবে আপডেট করা এবং প্রত্যেককে অবহিত করা যে এটির সাথে ফিরে আসে, আলোচনা এবং ইতিহাসের জন্য শক্ত লিঙ্ক সরবরাহ করে।
বিড্রেলিং

25
এটি অত্যন্ত ভয়ঙ্কর যে আপনি এটি আপ টু ডেট রাখছেন - আপনাকে ধন্যবাদ
ডেভিড থিলেন

1
দুর্ভাগ্যক্রমে এই মন্তব্য হিসাবে, ভূমিকা, এক্সটেনশন এবং স্ট্যাটিক ইন্টারফেস সদস্যদের কেবলমাত্র সি # 11 :(
ইয়ান কেম্প

436

না তারা সি # 3.0 এ বিদ্যমান নেই এবং 4.0-এ যোগ হবে না। এটি সি # এর জন্য বৈশিষ্ট্যগুলির তালিকায় রয়েছে তাই এটি ভবিষ্যতের তারিখে যুক্ত হতে পারে।

এই মুহুর্তে আপনি যা করতে পারেন তা হ'ল গেটএক্সএক্সএক্সএক্স স্টাইল এক্সটেনশন পদ্ধতিগুলি।


3
একইভাবে জেনেরিক বৈশিষ্ট্যগুলির সাথে: আপনাকে 'গেটএক্সএক্সএক্স <>' সিনট্যাক্স ব্যবহার করতে হবে।
জে বাজুজি

3
ঠিক আছে, আমি যা ভেবেছিলাম @ জে, হ্যাঁ, আমিও এটি ঘৃণা করি, হি। বিশেষত জেনেরিক ইনডেক্সার পাওয়ার অক্ষমতা ... দীর্ঘশ্বাস
ফেলুন

75
ফিচারের লিঙ্কে লিঙ্ক চান?
ড্যান এস্পারজা

2
সংস্করণ 6.0 এবং 7.0 সম্পর্কে কী?
ফাল্ক

2
2020 হিসাবে এই সম্পর্কে কোনও আপডেট আছে?
চাদ

265

না, তাদের অস্তিত্ব নেই।

আমি জানি যে সি # টিম তাদের এক পর্যায়ে বিবেচনা করছিল (বা কমপক্ষে এরিক লিপার্ট ছিল) - এক্সটেনশন কন্সট্রাক্টর এবং অপারেটরদের সাথে (যারা আপনার মাথা ঘুরে আসতে কিছুটা সময় নিতে পারে তবে শীতল ...) তবে, আমার অভ্যাস নেই তারা সি # 4 এর অংশ হবেন এমন কোনও প্রমাণ দেখেনি।


সম্পাদনা: তারা সি # 5 তে উপস্থিত হয়নি, এবং জুলাই ২০১৪ পর্যন্ত এটি সি # 6 তে হবে বলে মনে হচ্ছে না।

মাইক্রোসফ্ট-এর নভেম্বর ২০১২-এর সি # সংকলক দলের প্রিন্সিপাল ডেভলপার, এরিক লিপার্ট , ২০০৯ সালের অক্টোবরে এ সম্পর্কে ব্লগ করেছেন:


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

23
আপনি এক্সটেনশন পদ্ধতির সাথে বাঁধতে পারবেন না ... ডেটাবাইন্ডিংয়ের জন্য আপনার নিজস্ব সম্পত্তি যুক্ত করতে সক্ষম হওয়া অনেক পরিস্থিতিতে সহায়ক হতে পারে।
নিক

3
@ লেপ্পি - সম্পত্তি সম্প্রসারণের মানটি বুল এবং স্ট্রিংয়ের বৈশিষ্ট্যগুলিকে সবচেয়ে বেশি উপকৃত করবে বলে আমি মনে করি। ()শেষে এ থেকে মুক্তি পাওয়া আরও অনেক বেশি পঠনযোগ্য। আমি ব্যক্তিগতভাবে আমার জন্য জানি, আমি লিখি কমপক্ষে 90% এক্সটেনশনগুলি সেই 2 ধরণের are
কোড ম্যাভেরিক

4
এটি কেন কার্যকর হবে তার একটি উদাহরণ দেওয়ার জন্য, আমার একটি ইএফসিএফ মডেল রয়েছে। কিছু শ্রেণিতে আমার কেবল পঠনযোগ্য বৈশিষ্ট্য রয়েছে যা আমি ফর্ম্যাট করা তথ্য ফেরত দিতে ব্যবহার করি: FullName= FirstName + LastName, ShortName= FirstName + LastName[0]। আমি এই বৈশিষ্ট্যগুলির আরও যোগ করতে চাই, তবে আমি প্রকৃত ক্লাসগুলিকে "নোংরা" করতে চাই না। এক্ষেত্রে একটি এক্সটেনশন সম্পত্তি, যা কেবলমাত্র পঠনযোগ্য, তা সঠিক কারণ আমি কার্যকারিতা যুক্ত করতে পারি, মূল শ্রেণিকে পরিষ্কার রাখতে পারি এবং আমি ইউআইতে যে তথ্য প্রকাশ করতে চাই তা প্রকাশ করতে পারি।
Gup3rSuR4c

4
@ জোনস্কিট: আপনি ঠিক বলেছেন, নিজের ক্লাস তৈরি করে আমি যা করতে চাইছিলাম তা শেষ করে, তারপরে সমস্ত static implicit operator FileInfo(FileInfoEx fex)সিলড ক্লাসের পদ্ধতি এবং বৈশিষ্ট্য মোড়ক করে তারপরে যা সরবরাহ করে আমার থাকা ফাইলআইফোন অবজেক্টটি দেয়। এই ক্লাসটি সিল করা সত্ত্বেও এটি কার্যকরভাবে আমাকে ফাইলআইনফক্সেক্সকে চিকিত্সা করতে দেয় যেমন এটি ফাইলআইএনফো থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।
স্টিভ এল

27

আপডেট ( এই আপডেটটি দেখানোর জন্য @ চয়েস্টকে ধন্যবাদ ):

ম্যাডস টর্গারসেন: "এক্সটেনশন সবকিছুই এটি সি # 8.0 তে রূপান্তরিত করতে পারেনি। ভাষাটির ভবিষ্যতের ভবিষ্যতের বিষয়ে খুব উত্তেজনাপূর্ণ বিতর্কে আপনি যদি এটি করতে পারেন তবে এটি" ধরা পড়েছে ", এবং এখন আমরা নিশ্চিত করতে চাই যে আমরা এটি করি না এটিকে এমনভাবে যুক্ত করুন যা ভবিষ্যতের সম্ভাবনাগুলিকে বাধা দেয় Sometimes কখনও কখনও ভাষার নকশাটি খুব দীর্ঘ খেলা! "

উত্স: https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/ এ মন্তব্য বিভাগে


কয়েক বছর ধরে আমি এই প্রশ্নটি বাস্তবায়িত দেখেছি আশা করে এই প্রশ্নটি খোলার গণনা বন্ধ করেছি।

আচ্ছা, অবশেষে আমরা সবাই আনন্দ করতে পারি! মাইক্রোসফ্ট তাদের আসন্ন সি # 8 প্রকাশে এটি চালু করতে চলেছে।

সুতরাং এটি না করে ...

public static class IntExtensions
{
   public static bool Even(this int value)
   {
        return value % 2 == 0;
   }
}

আমরা শেষ পর্যন্ত এটি এর মতো করতে সক্ষম হবো ...

public extension IntExtension extends int
{
    public bool Even => this % 2 == 0;
}

সূত্র: https : //blog.nd depend.com/c-8-0-features-glimpse-future/


3
এই সপ্তাহে সি # 8.0 বৈশিষ্ট্যগুলি ঘোষিত হয়েছিল এবং আমি দুর্ভাগ্যক্রমে এর কোনও দেখতে পাইনি।
মাতেও টরেস-রুইজ

1
@ মাতিও টরেস-রুইজ 'ম্যাডস টর্গারসেন' (সি # দেব) এর একটি মন্তব্য, যার সম্পর্কে এ সম্পর্কে জিজ্ঞাসা করা ব্যক্তির জবাব (3 দিন আগে): "এক্সটেনশন সবকিছু এটিকে সি # 8.0 তে পরিণত করেনি। এটি" ধরা পড়েছে ", যদি আপনি চান , ভাষার ভবিষ্যতের ভবিষ্যতের বিষয়ে একটি খুব উত্তেজনাপূর্ণ বিতর্কে, এবং এখন আমরা নিশ্চিত করতে চাই যে আমরা এটি এমনভাবে যুক্ত করব না যা ভবিষ্যতের সম্ভাবনাগুলিকে বাধা দেয় Sometimes কখনও কখনও ভাষার নকশাটি একটি দীর্ঘ খেলা! " খারাপ লাগছে .. (মন্তব্য বিভাগে কোরাইমস লিঙ্কে এটি পড়ুন)
নভোস্ট

8

@ সাইকোনিটি যেমন উল্লেখ করেছে, আপনি বিদ্যমান অবজেক্টগুলিতে বৈশিষ্ট্য যুক্ত করতে শর্তসাপেক্ষে উইক টেবিলটি ব্যবহার করতে পারেন। ডায়নামিক এক্সপেন্ডোঅবজেক্টের সাথে মিলিত হয়ে আপনি কয়েকটি লাইনে ডায়নামিক এক্সটেনশন বৈশিষ্ট্য প্রয়োগ করতে পারেন:

using System.Dynamic;
using System.Runtime.CompilerServices;

namespace ExtensionProperties
{
    /// <summary>
    /// Dynamically associates properies to a random object instance
    /// </summary>
    /// <example>
    /// var jan = new Person("Jan");
    ///
    /// jan.Age = 24; // regular property of the person object;
    /// jan.DynamicProperties().NumberOfDrinkingBuddies = 27; // not originally scoped to the person object;
    ///
    /// if (jan.Age &lt; jan.DynamicProperties().NumberOfDrinkingBuddies)
    /// Console.WriteLine("Jan drinks too much");
    /// </example>
    /// <remarks>
    /// If you get 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' you should reference Microsoft.CSharp
    /// </remarks>
    public static class ObjectExtensions
    {
        ///<summary>Stores extended data for objects</summary>
        private static ConditionalWeakTable<object, object> extendedData = new ConditionalWeakTable<object, object>();

        /// <summary>
        /// Gets a dynamic collection of properties associated with an object instance,
        /// with a lifetime scoped to the lifetime of the object
        /// </summary>
        /// <param name="obj">The object the properties are associated with</param>
        /// <returns>A dynamic collection of properties associated with an object instance.</returns>
        public static dynamic DynamicProperties(this object obj) => extendedData.GetValue(obj, _ => new ExpandoObject());
    }
}

এক্সএমএল মন্তব্যে একটি ব্যবহারের উদাহরণ রয়েছে:

var jan = new Person("Jan");

jan.Age = 24; // regular property of the person object;
jan.DynamicProperties().NumberOfDrinkingBuddies = 27; // not originally scoped to the person object;

if (jan.Age < jan.DynamicProperties().NumberOfDrinkingBuddies)
{
    Console.WriteLine("Jan drinks too much");
}

jan = null; // NumberOfDrinkingBuddies will also be erased during garbage collection

সেরা উত্তর
N73k

1

যেহেতু সম্প্রতি আমার এটির প্রয়োজন ছিল, আমি উত্তরের উত্সটির দিকে নজর রেখেছি:

গ # বৈশিষ্ট্য যুক্ত করে শ্রেণি প্রসারিত করুন

এবং আরও গতিশীল সংস্করণ তৈরি করেছে:

public static class ObjectExtenders
{
    static readonly ConditionalWeakTable<object, List<stringObject>> Flags = new ConditionalWeakTable<object, List<stringObject>>();

    public static string GetFlags(this object objectItem, string key)
    {
        return Flags.GetOrCreateValue(objectItem).Single(x => x.Key == key).Value;
    }

    public static void SetFlags(this object objectItem, string key, string value)
    {
        if (Flags.GetOrCreateValue(objectItem).Any(x => x.Key == key))
        {
            Flags.GetOrCreateValue(objectItem).Single(x => x.Key == key).Value = value;
        }
        else
        {
            Flags.GetOrCreateValue(objectItem).Add(new stringObject()
            {
                Key = key,
                Value = value
            });
        }
    }

    class stringObject
    {
        public string Key;
        public string Value;
    }
}

এটি সম্ভবত অনেক উন্নতি করা যেতে পারে (স্ট্রিংয়ের পরিবর্তে নামকরণ, গতিশীল), আমি বর্তমানে এটি একটি হ্যাকি শর্তসাপেক্ষে উইকিটবেল ( https://gist.github.com/Jan-WillemdeBruyn/db79dd6fdef7b9845e217958db98c4d4 ) এর সাথে সিএফ ৩.৫ এ ব্যবহার করি


দুঃখিত, তবে যদিও এটি খুব পুঙ্খানুপুঙ্খ দেখাচ্ছে, এর এক্সটেনশন বৈশিষ্ট্যগুলির সাথে কোনও সম্পর্ক নেই, তবে কেবল এক্সটেনশন পদ্ধতিগুলি দেখায়।
ভাইকিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.