c# সি#আপনার প্রিয় এক্সটেনশান পদ্ধতি কি?(codeplex.com/extensionoverflow)




.net open-source (24)

আসুন আমরা আপনার চমৎকার এবং প্রিয় এক্সটেনশান পদ্ধতি পোস্ট করার উত্তরগুলির একটি তালিকা তৈরি করি।

প্রয়োজনীয়তাটি সম্পূর্ণ কোডটি পোস্ট করা উচিত এবং এটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ এবং একটি ব্যাখ্যা।

এই বিষয়ে উচ্চ আগ্রহের উপর ভিত্তি করে আমি Codeplex এক্সটেনশানফ্লোফ নামক একটি ওপেন সোর্স প্রকল্প সেট আপ করেছি।

কোডপ্লেক্স প্রকল্পে কোডটি রাখতে একটি স্বীকৃতি সহ আপনার উত্তরগুলি চিহ্নিত করুন।

সম্পূর্ণ সোর্সকোড পোস্ট করুন এবং একটি লিঙ্ক না দয়া করে।

কোডপ্লেক্স নিউজ:

24.08.2010 কোডপ্লেক্স পৃষ্ঠা এখন এখানে: http://extensionoverflow.codeplex.com/

11.11.2008 এক্সএমএল সেরিয়ালাইজ / এক্সএমএল ডেসেরিয়ালাইজ এখন Implemented এবং ইউনিট পরীক্ষা করা হয়

11.11.2008 এখনও আরও বিকাশকারীদের জন্য রুম আছে। ;-) এখন যোগ দিন!

11.11.2008 তৃতীয় BKristensen Codeplex BKristensen যোগদান করেছেন, BKristensen

11.11.2008 ফর্ম্যাট উইথ এখন Implemented এবং ইউনিট পরীক্ষা করা হয়

09.11.2008 দ্বিতীয় contributer Codeplex ওভারফ্লো যোগদান। chakrit ।

09.11.2008 আমাদের আরো ডেভেলপারদের প্রয়োজন। ;-)

09.11.2008 ThrowIfArgumentIsNull এখন কোডপ্লক্সে Implemented এবং ইউনিট পরীক্ষা


এটি চালু করুন:

DbCommand command = connection.CreateCommand();
command.CommandText = "SELECT @param";

DbParameter param = command.CreateParameter();
param.ParameterName = "@param";
param.Value = "Hello World";

command.Parameters.Add(param);

... এই মধ্যে:

DbCommand command = connection.CreateCommand("SELECT {0}", "Hello World");

... এই এক্সটেনশন পদ্ধতি ব্যবহার করে:

using System;
using System.Data.Common;
using System.Globalization;
using System.Reflection;

namespace DbExtensions {

   public static class Db {

      static readonly Func<DbConnection, DbProviderFactory> getDbProviderFactory;
      static readonly Func<DbCommandBuilder, int, string> getParameterName;
      static readonly Func<DbCommandBuilder, int, string> getParameterPlaceholder;

      static Db() {

         getDbProviderFactory = (Func<DbConnection, DbProviderFactory>)Delegate.CreateDelegate(typeof(Func<DbConnection, DbProviderFactory>), typeof(DbConnection).GetProperty("DbProviderFactory", BindingFlags.Instance | BindingFlags.NonPublic).GetGetMethod(true));
         getParameterName = (Func<DbCommandBuilder, int, string>)Delegate.CreateDelegate(typeof(Func<DbCommandBuilder, int, string>), typeof(DbCommandBuilder).GetMethod("GetParameterName", BindingFlags.Instance | BindingFlags.NonPublic, Type.DefaultBinder, new Type[] { typeof(Int32) }, null));
         getParameterPlaceholder = (Func<DbCommandBuilder, int, string>)Delegate.CreateDelegate(typeof(Func<DbCommandBuilder, int, string>), typeof(DbCommandBuilder).GetMethod("GetParameterPlaceholder", BindingFlags.Instance | BindingFlags.NonPublic, Type.DefaultBinder, new Type[] { typeof(Int32) }, null));
      }

      public static DbProviderFactory GetProviderFactory(this DbConnection connection) {
         return getDbProviderFactory(connection);
      }

      public static DbCommand CreateCommand(this DbConnection connection, string commandText, params object[] parameters) {

         if (connection == null) throw new ArgumentNullException("connection");

         return CreateCommandImpl(GetProviderFactory(connection).CreateCommandBuilder(), connection.CreateCommand(), commandText, parameters);
      }

      private static DbCommand CreateCommandImpl(DbCommandBuilder commandBuilder, DbCommand command, string commandText, params object[] parameters) {

         if (commandBuilder == null) throw new ArgumentNullException("commandBuilder");
         if (command == null) throw new ArgumentNullException("command");
         if (commandText == null) throw new ArgumentNullException("commandText");

         if (parameters == null || parameters.Length == 0) {
            command.CommandText = commandText;
            return command;
         }

         object[] paramPlaceholders = new object[parameters.Length];

         for (int i = 0; i < paramPlaceholders.Length; i++) {

            DbParameter dbParam = command.CreateParameter();
            dbParam.ParameterName = getParameterName(commandBuilder, i);
            dbParam.Value = parameters[i] ?? DBNull.Value;
            command.Parameters.Add(dbParam);

            paramPlaceholders[i] = getParameterPlaceholder(commandBuilder, i);
         }

         command.CommandText = String.Format(CultureInfo.InvariantCulture, commandText, paramPlaceholders);

         return command;
      }
   }
}

আরো ADO.NET এক্সটেনশান পদ্ধতি: DbExtensions এক্সটেনশনসDbExtensions


এটি একটি এমভিসি এর জন্য এটি প্রতিটিতে উপলব্ধ যে পরিবর্তনশীল একটি <label />ট্যাগ জেনারেট করার ক্ষমতা যোগ Htmlকরে ViewPage। আশা করি এটি একই এক্সটেনশান বিকাশ করার চেষ্টা অন্যদের ব্যবহার করা হবে।

ব্যবহার করুন:

<%= Html.Label("LabelId", "ForId", "Text")%>

আউটপুট:

<label id="LabelId" for="ForId">Text</label>

কোড:

public static class HtmlHelperExtensions
{
    public static string Label(this HtmlHelper Html, string @for, string text)
    {
        return Html.Label(null, @for, text);
    }

    public static string Label(this HtmlHelper Html, string @for, string text, object htmlAttributes)
    {
        return Html.Label(null, @for, text, htmlAttributes);
    }

    public static string Label(this HtmlHelper Html, string @for, string text, IDictionary<string, object> htmlAttributes)
    {
        return Html.Label(null, @for, text, htmlAttributes);
    }

    public static string Label(this HtmlHelper Html, string id, string @for, string text)
    {
        return Html.Label(id, @for, text, null);
    }

    public static string Label(this HtmlHelper Html, string id, string @for, string text, object htmlAttributes)
    {
        return Html.Label(id, @for, text, new RouteValueDictionary(htmlAttributes));
    }

    public static string Label(this HtmlHelper Html, string id, string @for, string text, IDictionary<string, object> htmlAttributes)
    {
        TagBuilder tag = new TagBuilder("label");

        tag.MergeAttributes(htmlAttributes);

        if (!string.IsNullOrEmpty(id))
            tag.MergeAttribute("id", Html.AttributeEncode(id));

        tag.MergeAttribute("for", Html.AttributeEncode(@for));

        tag.SetInnerText(Html.Encode(text));

        return tag.ToString(TagRenderMode.Normal);
    }
}

আমি এই একটি বেশ দরকারী খুঁজে পাচ্ছি:

public static class PaulaBean
{
    private static String paula = "Brillant";
    public static String GetPaula<T>(this T obj) {
        return paula;
    }
}

আপনি CodePlex এটি ব্যবহার করতে পারেন।


IENumerables জন্য প্রতিটি জন্য

public static class FrameworkExtensions
{
    // a map function
    public static void ForEach<T>(this IEnumerable<T> @enum, Action<T> mapFunction)
    {
        foreach (var item in @enum) mapFunction(item);
    }
}

নির্বোধ উদাহরণ:

var buttons = GetListOfButtons() as IEnumerable<Button>;

// click all buttons
buttons.ForEach(b => b.Click());

শীতল উদাহরণ:

// no need to type the same assignment 3 times, just
// new[] up an array and use foreach + lambda
// everything is properly inferred by csc :-)
new { itemA, itemB, itemC }
    .ForEach(item => {
        item.Number = 1;
        item.Str = "Hello World!";
    });

বিঃদ্রঃ:

এটি Select মতো নয় কারণ Select আপনার ফাংশনটি অন্য তালিকাতে রূপান্তর করার জন্য কিছু ফেরত দেওয়ার প্রত্যাশা করে।

জন্য প্রতিটি সহজভাবে আপনি কোন রূপান্তর / তথ্য ম্যানিপুলেশন ছাড়া আইটেম প্রতিটি জন্য কিছু সঞ্চালন করতে পারবেন।

আমি এটি তৈরি করেছি তাই আমি আরো কার্যকরী শৈলীতে প্রোগ্রাম করতে পারি এবং আমি বিস্মিত ছিলাম যে তালিকাটি একটি ForEach আছে যখন IENumerable নয়।

Codeplex প্রকল্পে এই রাখুন


সব উপায়ে কোডপ্লেক্স প্রকল্পের এই রাখুন।

এক্সএমএল সিরিয়ালাইজিং / Deserializing বস্তু:

/// <summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="obj">Object to serialize</param>
/// <returns>A string that represents Xml, empty otherwise</returns>
public static string XmlSerialize<T>(this T obj) where T : class, new()
{
    if (obj == null) throw new ArgumentNullException("obj");

    var serializer = new XmlSerializer(typeof(T));
    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }
}

/// <summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialize<T>(this string xml) where T : class, new()
{
    if (xml == null) throw new ArgumentNullException("xml");

    var serializer = new XmlSerializer(typeof(T));
    using (var reader = new StringReader(xml))
    {
        try { return (T)serializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
    }
}

আমি এই একটি সহায়ক খুঁজে পাওয়া যায় নি

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> pSeq)
{
    return pSeq ?? Enumerable.Empty<T>();
}

এটি কলিং কোডের নল চেক মুছে ফেলে। আপনি এখন করতে পারেন

MyList.EmptyIfNull().Where(....)

এখানে আমি তৈরি আজ এক।

// requires .NET 4

public static TReturn NullOr<TIn, TReturn>(this TIn obj, Func<TIn, TReturn> func,
        TReturn elseValue = default(TReturn)) where TIn : class
    { return obj != null ? func(obj) : elseValue; }

// versions for CLR 2, which doesn't support optional params

public static TReturn NullOr<TIn, TReturn>(this TIn obj, Func<TIn, TReturn> func,
        TReturn elseValue) where TIn : class
    { return obj != null ? func(obj) : elseValue; }
public static TReturn NullOr<TIn, TReturn>(this TIn obj, Func<TIn, TReturn> func)
        where TIn : class
    { return obj != null ? func(obj) : default(TReturn); }

এটি আপনাকে এটি করতে দেয়:

var lname = thingy.NullOr(t => t.Name).NullOr(n => n.ToLower());

যা আরও বেশি তাত্পর্যপূর্ণ এবং (আইএমও) এর চেয়ে সহজে পড়া যায়:

var lname = (thingy != null ? thingy.Name : null) != null
    ? thingy.Name.ToLower() : null;

মাপ মোকাবেলা করার জন্য একটি সুবিধাজনক উপায়:

public static class Extensions {
    public static int K(this int value) {
        return value * 1024;
    }
    public static int M(this int value) {
        return value * 1024 * 1024;
    }
}

public class Program {
    public void Main() {
        WSHttpContextBinding serviceMultipleTokenBinding = new WSHttpContextBinding() {
            MaxBufferPoolSize = 2.M(), // instead of 2097152
            MaxReceivedMessageSize = 64.K(), // instead of 65536
        };
    }
}

gitorious.org/cadenza আমি দেখেছি সবচেয়ে দরকারী এক্সটেনশন পদ্ধতির একটি সম্পূর্ণ লাইব্রেরি।


রোমান সংখ্যার জন্য এখানে একটি থেকে এবং থেকে। প্রায়ই ব্যবহৃত হয় না, কিন্তু সহজ হতে পারে। ব্যবহার:

if ("IV".IsValidRomanNumeral())
{
   // Do useful stuff with the number 4.
}

Console.WriteLine("MMMDCCCLXXXVIII".ParseRomanNumeral());
Console.WriteLine(3888.ToRomanNumeralString());

উৎস:

    public static class RomanNumeralExtensions
    {
        private const int NumberOfRomanNumeralMaps = 13;

        private static readonly Dictionary<string, int> romanNumerals =
            new Dictionary<string, int>(NumberOfRomanNumeralMaps)
            {
                { "M", 1000 }, 
                { "CM", 900 }, 
                { "D", 500 }, 
                { "CD", 400 }, 
                { "C", 100 }, 
                { "XC", 90 }, 
                { "L", 50 }, 
                { "XL", 40 }, 
                { "X", 10 }, 
                { "IX", 9 }, 
                { "V", 5 }, 
                { "IV", 4 }, 
                { "I", 1 }
            };

        private static readonly Regex validRomanNumeral = new Regex(
            "^(?i:(?=[MDCLXVI])((M{0,3})((C[DM])|(D?C{0,3}))"
            + "?((X[LC])|(L?XX{0,2})|L)?((I[VX])|(V?(II{0,2}))|V)?))$", 
            RegexOptions.Compiled);

        public static bool IsValidRomanNumeral(this string value)
        {
            return validRomanNumeral.IsMatch(value);
        }

        public static int ParseRomanNumeral(this string value)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            value = value.ToUpperInvariant().Trim();

            var length = value.Length;

            if ((length == 0) || !value.IsValidRomanNumeral())
            {
                throw new ArgumentException("Empty or invalid Roman numeral string.", "value");
            }

            var total = 0;
            var i = length;

            while (i > 0)
            {
                var digit = romanNumerals[value[--i].ToString()];

                if (i > 0)
                {
                    var previousDigit = romanNumerals[value[i - 1].ToString()];

                    if (previousDigit < digit)
                    {
                        digit -= previousDigit;
                        i--;
                    }
                }

                total += digit;
            }

            return total;
        }

        public static string ToRomanNumeralString(this int value)
        {
            const int MinValue = 1;
            const int MaxValue = 3999;

            if ((value < MinValue) || (value > MaxValue))
            {
                throw new ArgumentOutOfRangeException("value", value, "Argument out of Roman numeral range.");
            }

            const int MaxRomanNumeralLength = 15;
            var sb = new StringBuilder(MaxRomanNumeralLength);

            foreach (var pair in romanNumerals)
            {
                while (value / pair.Value > 0)
                {
                    sb.Append(pair.Key);
                    value -= pair.Value;
                }
            }

            return sb.ToString();
        }
    }

MySQLDataReader থেকে মানগুলি সরিয়ে নেওয়ার সময় আমি ক্লান্তিকর নিল-পরীক্ষণের ক্লান্ত হয়ে পড়েছিলাম, তাই:

public static DateTime? GetNullableDateTime(this MySqlDataReader dr, string fieldName)
{
    DateTime? nullDate = null;
    return dr.IsDBNull(dr.GetOrdinal(fieldName)) ? nullDate : dr.GetDateTime(fieldName);
}

public static string GetNullableString(this MySqlDataReader dr, string fieldName)
{
    return dr.IsDBNull(dr.GetOrdinal(fieldName)) ? String.Empty : dr.GetString(fieldName);
}

public static char? GetNullableChar(this MySqlDataReader dr, string fieldName)
{
    char? nullChar = null;
    return dr.IsDBNull(dr.GetOrdinal(fieldName)) ? nullChar : dr.GetChar(fieldName);
}

অবশ্যই এই SqlDataReader সঙ্গে ব্যবহার করা যেতে পারে।

হ্যাঙ্গি এবং জো উভয়টি কীভাবে এটি করবেন তার কিছু ভাল মন্তব্য করেছে, এবং তারপরেও আমার কাছে ভিন্ন প্রসঙ্গে অনুরূপ কিছু প্রয়োগ করার সুযোগ রয়েছে, তাই এখানে অন্য একটি সংস্করণ রয়েছে:

public static int? GetNullableInt32(this IDataRecord dr, int ordinal)
{
    int? nullInt = null;
    return dr.IsDBNull(ordinal) ? nullInt : dr.GetInt32(ordinal);
}

public static int? GetNullableInt32(this IDataRecord dr, string fieldname)
{
    int ordinal = dr.GetOrdinal(fieldname);
    return dr.GetNullableInt32(ordinal);
}

public static bool? GetNullableBoolean(this IDataRecord dr, int ordinal)
{
    bool? nullBool = null;
    return dr.IsDBNull(ordinal) ? nullBool : dr.GetBoolean(ordinal);
}

public static bool? GetNullableBoolean(this IDataRecord dr, string fieldname)
{
    int ordinal = dr.GetOrdinal(fieldname);
    return dr.GetNullableBoolean(ordinal);
}

আমার MiscUtil প্রকল্পে আমার বিভিন্ন এক্সটেনশান পদ্ধতি রয়েছে (সম্পূর্ণ উৎস সেখানে পাওয়া যায় - আমি এখানে এটি পুনরাবৃত্তি করতে যাচ্ছি না)। আমার পছন্দসই, যা কিছু অন্যান্য ক্লাস (যেমন রেঞ্জ) জড়িত:

তারিখ এবং সময় উপাদান - বেশিরভাগ ইউনিট পরীক্ষা জন্য। আমি উত্পাদন তাদের ব্যবহার করতে চাই না :)

var birthday = 19.June(1976);
var workingDay = 7.Hours() + 30.Minutes();

রেঞ্জ এবং stepping - তার অপারেটর স্টাফ জন্য মার্কস Gravell ব্যাপক ধন্যবাদ এই সম্ভব করতে:

var evenNaturals = 2.To(int.MaxValue).Step(2);
var daysSinceBirth = birthday.To(DateTime.Today).Step(1.Days());

তুলনা:

var myComparer = ProjectionComparer.Create(Person p => p.Name);
var next = myComparer.ThenBy(p => p.Age);
var reversed = myComparer.Reverse();

আর্গুমেন্ট চেকিং:

x.ThrowIfNull("x");

LINQ থেকে এক্সএমএলটি বেনামে প্রযোজ্য (বা উপযুক্ত বৈশিষ্ট্যের সাথে অন্যান্য ধরনের):

// <Name>Jon</Name><Age>32</Age>
new { Name="Jon", Age=32}.ToXElements();
// Name="Jon" Age="32" (as XAttributes, obviously)
new { Name="Jon", Age=32}.ToXAttributes()

Push LINQ - এখানে ব্যাখ্যা করার জন্য খুব বেশি সময় লাগবে, কিন্তু এটির জন্য অনুসন্ধান করুন।


DateTimeExtensions

উদাহরণ:

DateTime firstDayOfMonth = DateTime.Now.First();
DateTime lastdayOfMonth = DateTime.Now.Last();
DateTime lastFridayInMonth = DateTime.Now.Last(DayOfWeek.Friday);
DateTime nextFriday = DateTime.Now.Next(DayOfWeek.Friday);
DateTime lunchTime = DateTime.Now.SetTime(11, 30);
DateTime noonOnFriday = DateTime.Now.Next(DayOfWeek.Friday).Noon();
DateTime secondMondayOfMonth = DateTime.Now.First(DayOfWeek.Monday).Next(DayOfWeek.Monday).Midnight();

নীচে একটি হল এক্সটেনশন পদ্ধতি আত্তীকরণ করে যে রিক Strahl এর কোড (এবং খুব মন্তব্য) আপনি অনুমান বা প্রতিটি সময় আপনি একটি স্ট্রিং রূপান্তর একটি বাইট বিন্যাস বা টেক্সট ফাইল বাইট অর্ডার পঠিত করা থামাতে।

স্নিপেটটি আপনাকে কেবল করতে দেয়:

byte[] buffer = File.ReadAllBytes(@"C:\file.txt");
string content = buffer.GetString();

আপনি যদি কোন বাগ খুঁজে পেতে মন্তব্য যোগ করুন। Codeplex প্রকল্পে এটি অন্তর্ভুক্ত করতে বিনা দ্বিধায়।

public static class Extensions
{
    /// <summary>
    /// Converts a byte array to a string, using its byte order mark to convert it to the right encoding.
    /// Original article: http://www.west-wind.com/WebLog/posts/197245.aspx
    /// </summary>
    /// <param name="buffer">An array of bytes to convert</param>
    /// <returns>The byte as a string.</returns>
    public static string GetString(this byte[] buffer)
    {
        if (buffer == null || buffer.Length == 0)
            return "";

        // Ansi as default
        Encoding encoding = Encoding.Default;       

        /*
            EF BB BF    UTF-8 
            FF FE UTF-16    little endian 
            FE FF UTF-16    big endian 
            FF FE 00 00 UTF-32, little endian 
            00 00 FE FF UTF-32, big-endian 
         */

        if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
            encoding = Encoding.UTF8;
        else if (buffer[0] == 0xfe && buffer[1] == 0xff)
            encoding = Encoding.Unicode;
        else if (buffer[0] == 0xfe && buffer[1] == 0xff)
            encoding = Encoding.BigEndianUnicode; // utf-16be
        else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
            encoding = Encoding.UTF32;
        else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)
            encoding = Encoding.UTF7;

        using (MemoryStream stream = new MemoryStream())
        {
            stream.Write(buffer, 0, buffer.Length);
            stream.Seek(0, SeekOrigin.Begin);
            using (StreamReader reader = new StreamReader(stream, encoding))
            {
                return reader.ReadToEnd();
            }
        }
    }
}

Winform নিয়ন্ত্রণের জন্য:

/// <summary>
/// Returns whether the function is being executed during design time in Visual Studio.
/// </summary>
public static bool IsDesignTime(this Control control)
{
    if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
    {
        return true;
    }

    if (control.Site != null && control.Site.DesignMode)
    {
        return true;
    }

    var parent = control.Parent;
    while (parent != null)
    {
        if (parent.Site != null && parent.Site.DesignMode)
        {
            return true;
        }
        parent = parent.Parent;
    }
    return false;
}

/// <summary>
/// Sets the DropDownWidth to ensure that no item's text is cut off.
/// </summary>
public static void SetDropDownWidth(this ComboBox comboBox)
{
    var g = comboBox.CreateGraphics();
    var font = comboBox.Font;
    float maxWidth = 0;

    foreach (var item in comboBox.Items)
    {
        maxWidth = Math.Max(maxWidth, g.MeasureString(item.ToString(), font).Width);
    }

    if (comboBox.Items.Count > comboBox.MaxDropDownItems)
    {
        maxWidth += SystemInformation.VerticalScrollBarWidth;
    }

    comboBox.DropDownWidth = Math.Max(comboBox.Width, Convert.ToInt32(maxWidth));
}

IsDesignTime ব্যবহার:

public class SomeForm : Form
{
    public SomeForm()
    {
        InitializeComponent();

        if (this.IsDesignTime())
        {
            return;
        }

        // Do something that makes the visual studio crash or hang if we're in design time,
        // but any other time executes just fine
    }
}

SetDropdownWidth ব্যবহার:

ComboBox cbo = new ComboBox { Width = 50 };
cbo.Items.Add("Short");
cbo.Items.Add("A little longer");
cbo.Items.Add("Holy cow, this is a really, really long item. How in the world will it fit?");
cbo.SetDropDownWidth();

আমি উল্লেখ করতে ভুলে গেছি, কোডপ্লেক্সে এগুলি ব্যবহার করতে বিনা দ্বিধায় ...


আমার রূপান্তর এক্সটেনশন যা আপনাকে করতে দেয়:

int i = myString.To<int>();

এখানে এটি পোস্ট করা হয়েছে, দ্য সফটওয়্যারজডিআই ডটকম

public static T To<T>(this IConvertible obj)
{
  return (T)Convert.ChangeType(obj, typeof(T));
}

public static T ToOrDefault<T>
             (this IConvertible obj)
{
    try
    {
        return To<T>(obj);
    }
    catch
    {
        return default(T);
    }
}

public static bool ToOrDefault<T>
                    (this IConvertible obj,
                     out T newObj)
{
    try
    {
        newObj = To<T>(obj); 
        return true;
    }
    catch
    {
        newObj = default(T); 
        return false;
    }
}

public static T ToOrOther<T>
                       (this IConvertible obj,
                       T other)
{
  try
  {
      return To<T>obj);
  }
  catch
  {
      return other;
  }
}

public static bool ToOrOther<T>
                         (this IConvertible obj,
                         out T newObj,
                         T other)
{
    try
    {
        newObj = To<T>(obj);
        return true;
    }
    catch
    {
        newObj = other;
        return false;
    }
}

public static T ToOrNull<T>
                      (this IConvertible obj)
                      where T : class
{
    try
    {
        return To<T>(obj);
    }
    catch
    {
        return null;
    }
}

public static bool ToOrNull<T>
                  (this IConvertible obj,
                  out T newObj)
                  where T : class
{
    try
    {
        newObj = To<T>(obj);
        return true;
    }
    catch
    {
        newObj = null;
        return false;
    }
}

আপনি ব্যর্থতার জন্য ডিফল্ট জিজ্ঞাসা করতে পারেন (সংখ্যাসূচকদের জন্য ফাঁকা কন্সট্রাকটর বা "0" কল করুন), একটি "ডিফল্ট" মান উল্লেখ করুন (আমি এটি "অন্যান্য" বলি), অথবা নাল (যেখানে T: শ্রেণী) জিজ্ঞাসা করুন। আমি উভয় নীরব ব্যতিক্রম মডেল এবং একটি সাধারন TryParse মডেল প্রদান করেছি যা গৃহীত পদক্ষেপকে নির্দেশ করে একটি বুল ফিরিয়ে দেয় এবং একটি বাহ্যিক প্যারামিটার নতুন মান ধারণ করে। তাই আমাদের কোড এই মত জিনিস করতে পারেন

int i = myString.To<int>();
string a = myInt.ToOrDefault<string>();
//note type inference
DateTime d = myString.ToOrOther(DateTime.MAX_VALUE);
double d;
//note type inference
bool didItGiveDefault = myString.ToOrDefault(out d);
string s = myDateTime.ToOrNull<string>();

আমি সম্পূর্ণ পরিষ্কারভাবে পুরো জিনিস রোল করতে Nullable ধরনের পেতে পারে না। আমি তোয়ালে ফেলে দেয়ার প্রায় 20 মিনিট আগে চেষ্টা করেছি।


ThrowIfArgumentIsNull হল সেই নিল চেক করার জন্য একটি চমৎকার উপায় যা আমরা সবাই করতে পারি।

public static class Extensions
{
    public static void ThrowIfArgumentIsNull<T>(this T obj, string parameterName) where T : class
    {
        if (obj == null) throw new ArgumentNullException(parameterName + " not allowed to be null");
    }
}

নীচে এটি ব্যবহার করার উপায় এবং এটি আপনার নামস্থানগুলিতে সমস্ত ক্লাসে বা যেখানেই আপনি এটির নামস্পেসটি ব্যবহার করেন সেখানেই এটি কাজ করে।

internal class Test
{
    public Test(string input1)
    {
        input1.ThrowIfArgumentIsNull("input1");
    }
}

CodePlex প্রকল্পে এই কোডটি ব্যবহার করা ঠিক।


এটি আমাকে জ্বালাতন করে যে LINQ আমাকে একটি আদেশ দেয় যা ICOMParer কে একটি যুক্তি হিসাবে বাস্তবায়ন করে, কিন্তু একটি সহজ বেনামী তুলনাকারী ফাংশনে পাস সমর্থন করে না। আমি যে সংশোধন।

এই ক্লাস আপনার তুলনাকারী ফাংশন থেকে একটি IComparer তৈরি করে ...

/// <summary>
///     Creates an <see cref="IComparer{T}"/> instance for the given
///     delegate function.
/// </summary>
internal class ComparerFactory<T> : IComparer<T>
{
    public static IComparer<T> Create(Func<T, T, int> comparison)
    {
        return new ComparerFactory<T>(comparison);
    }

    private readonly Func<T, T, int> _comparison;

    private ComparerFactory(Func<T, T, int> comparison)
    {
        _comparison = comparison;
    }

    #region IComparer<T> Members

    public int Compare(T x, T y)
    {
        return _comparison(x, y);
    }

    #endregion
}

... এবং এই এক্সটেনশান পদ্ধতি enumerables আমার নতুন আদেশের overloads প্রকাশ। আমি LINQ থেকে SQL এ কাজ করে সন্দেহ করি, তবে এটি LINQ থেকে অবজেক্টের জন্য দুর্দান্ত।

public static class EnumerableExtensions
{
    /// <summary>
    /// Sorts the elements of a sequence in ascending order by using a specified comparison delegate.
    /// </summary>
    public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector,
                                                                     Func<TKey, TKey, int> comparison)
    {
        var comparer = ComparerFactory<TKey>.Create(comparison);
        return source.OrderBy(keySelector, comparer);
    }

    /// <summary>
    /// Sorts the elements of a sequence in descending order by using a specified comparison delegate.
    /// </summary>
    public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector,
                                                                               Func<TKey, TKey, int> comparison)
    {
        var comparer = ComparerFactory<TKey>.Create(comparison);
        return source.OrderByDescending(keySelector, comparer);
    }
}

আপনি যদি চান চান codeplex এ এই স্বাগতম।


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

public static void Log(this Exception obj)
{
  //your logging logic here
}

এবং এটি এইভাবে ব্যবহার করা হয়:

try
{
    //Your stuff here
}
catch(Exception ex)
{
    ex.Log();
}

[দুবার পোস্ট করার জন্য দুঃখিত; দ্বিতীয়টি আরও ভাল ডিজাইন করা হয়েছে :-)]


"কোডপ্লেক্স প্রজেক্টে কোডটি রাখতে একটি স্বীকৃতি সহ আপনার উত্তরগুলি চিহ্নিত করুন।"

কেন?CC-by-sa-2.5 অধীনে এই সাইটের সমস্ত স্টাফ , তাই একই লাইসেন্সের অধীনে আপনার এক্সটেনশান ওভারফ্লো প্রজেক্টটি ঠিক করুন এবং আপনি এটি ব্যবহার করতে পারেন।

যাইহোক, এখানে একটি স্ট্রিং। রিভার্স ফাংশন, এই প্রশ্নের উপর ভিত্তি করে ।

/// <summary>
/// Reverse a String
/// </summary>
/// <param name="input">The string to Reverse</param>
/// <returns>The reversed String</returns>
public static string Reverse(this string input)
{
    char[] array = input.ToCharArray();
    Array.Reverse(array);
    return new string(array);
}

নির্দিষ্ট সংস্কৃতি ব্যবহার করে ফরম্যাট করা স্ট্রিংয়ের জন্য একটি ডবল রূপান্তর করুন:

public static class ExtensionMethods 
{
  public static string ToCurrency(this double value, string cultureName)
  {
    CultureInfo currentCulture = new CultureInfo(cultureName);
    return (string.Format(currentCulture, "{0:C}", value));
  }
}

উদাহরণ:

double test = 154.20;
string testString = test.ToCurrency("en-US"); // $154.20

স্ট্রিং। ফরম্যাট শর্টকাট:

public static class StringExtensions
{
    // Enable quick and more natural string.Format calls
    public static string F(this string s, params object[] args)
    {
        return string.Format(s, args);
    }
}

উদাহরণ:

var s = "The co-ordinate is ({0}, {1})".F(point.X, point.Y);

দ্রুত কপি এবং পেস্ট জন্য here যান।

"some string".F("param") পরিবর্তে "some string".F("param") টাইপ করার জন্য এটি আরও স্বাভাবিক না। "some string".F("param")string.Format("some string", "param") ?

আরও পঠনযোগ্য নামের জন্য, এই পরামর্শগুলির মধ্যে একটি করে চেষ্টা করুন:

s = "Hello {0} world {1}!".Fmt("Stack", "Overflow");
s = "Hello {0} world {1}!".FormatBy("Stack", "Overflow");
s = "Hello {0} world {1}!".FormatWith("Stack", "Overflow");
s = "Hello {0} world {1}!".Display("Stack", "Overflow");
s = "Hello {0} world {1}!".With("Stack", "Overflow");

..


C # এ সরানোর সময় আমি ভিসুয়াল বেসিক এর বিবৃতি মিস করি , তাই এখানে এটি চলে যায়:

public static void With<T>(this T obj, Action<T> act) { act(obj); }

এবং এখানে কিভাবে এটি C # এ ব্যবহার করতে হয়:

someVeryVeryLonggggVariableName.With(x => {
    x.Int = 123;
    x.Str = "Hello";
    x.Str2 = " World!";
});

অনেক টাইপ সংরক্ষণ করে!

এই তুলনা করুন:

someVeryVeryLonggggVariableName.Int = 123;
someVeryVeryLonggggVariableName.Str = "Hello";
someVeryVeryLonggggVariableName.Str2 = " World!";

কোডপ্লেক্স প্রকল্পের মধ্যে রাখা


একটি উটকেস ওয়ার্ড বা পাস্কালসেস ওয়ার্ড নেয় এবং "শব্দটিকে" শব্দ করে, যেমন উটেলসেস ওয়ার্ড => উট কেস ওয়ার্ড

public static string Wordify( this string camelCaseWord )
{
    // if the word is all upper, just return it
    if( !Regex.IsMatch( camelCaseWord, "[a-z]" ) )
        return camelCaseWord;

    return string.Join( " ", Regex.Split( camelCaseWord, @"(?<!^)(?=[A-Z])" ) );
}

আমি প্রায়ই ক্যাপিটালাইজ সঙ্গে conjuction এটি ব্যবহার

public static string Capitalize( this string word )
{
    return word[0].ToString( ).ToUpper( ) + word.Substring( 1 );
}

উদাহরণ ব্যবহার

SomeEntityObject entity = DataAccessObject.GetSomeEntityObject( id );
List<PropertyInfo> properties = entity.GetType().GetPublicNonCollectionProperties( );

// wordify the property names to act as column headers for an html table or something
List<string> columns = properties.Select( p => p.Name.Capitalize( ).Wordify( ) ).ToList( );

Codeplex প্রকল্প ব্যবহার করতে বিনামূল্যে





extension-methods