সি # এর জন্য আপনার পছন্দসই এক্সটেনশন পদ্ধতিগুলি কী কী? (Codeplex.com/extensionoverflow)


478

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

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

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

কোডপ্লেক্স প্রকল্পে কোডটি রাখার জন্য দয়া করে আপনার উত্তরগুলি চিহ্নিত করুন mark

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

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

24.08.2010 কোডপ্লেক্স পৃষ্ঠাটি এখন এখানে রয়েছে: http://existanceoverflow.codeplex.com/

১১.১১.২০০৮ এক্সএমএলসিরালাইজ / এক্সএমএল ডিজিজারালাইজ এখন বাস্তবায়িত এবং ইউনিট পরীক্ষিত

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

11.11.2008 তৃতীয় অবদানকারী এক্সটেনশন ওভারফ্লোতে যোগ দিয়েছেন , বি ক্রিস্টেনসেনকে স্বাগতম

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

09.11.2008 দ্বিতীয় অবদানকারী এক্সটেনশন ওভারফ্লোতে যোগদান করেছেন । স্বাগত জানাই চাকরিট

09.11.2008 আমাদের আরও বিকাশকারী প্রয়োজন। ;-)

09.11.2008 ThrowIfArgumentIsNull এখন বাস্তবায়িত এবং ইউনিট পরিক্ষিত Codeplex উপর।


এখন প্রথম কোড কোডেপ্লেক্স সাইটে প্রতিশ্রুতিবদ্ধ।
বোভিয়াম

এরিক দুর্ভাগ্যক্রমে কোডেপ্লেক্সে এখন সবকিছু শুরু হয়েছে। যাইহোক যোগদান করুন।
বোভিয়াম

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

সি # এক্সটেনশন পদ্ধতিগুলি গ্রাফকোডার্স
গৌরব

উত্তর:


232
public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

আমাকে প্রতিস্থাপন করতে অনুমতি দেয়:

if(reallyLongIntegerVariableName == 1 || 
    reallyLongIntegerVariableName == 6 || 
    reallyLongIntegerVariableName == 9 || 
    reallyLongIntegerVariableName == 11)
{
  // do something....
}

and

if(reallyLongStringVariableName == "string1" || 
    reallyLongStringVariableName == "string2" || 
    reallyLongStringVariableName == "string3")
{
  // do something....
}

and

if(reallyLongMethodParameterName == SomeEnum.Value1 || 
    reallyLongMethodParameterName == SomeEnum.Value2 || 
    reallyLongMethodParameterName == SomeEnum.Value3 || 
    reallyLongMethodParameterName == SomeEnum.Value4)
{
  // do something....
}

সঙ্গে:

if(reallyLongIntegerVariableName.In(1,6,9,11))
{
      // do something....
}

and

if(reallyLongStringVariableName.In("string1","string2","string3"))
{
      // do something....
}

and

if(reallyLongMethodParameterName.In(SomeEnum.Value1, SomeEnum.Value2, SomeEnum.Value3, SomeEnum.Value4)
{
  // do something....
}

2
ওয়েল এটি সংকলন করে যদি আপনি System.Linq ব্যবহার করছেন;
রিউ

11
হতে পারে "ইকুয়ালআনিওফ" "ইন" এর চেয়ে ভাল নাম হতে পারে?
টম বুশেল

10
আমি নিশ্চিত না যে আমি এটি পছন্দ করি - আমি এর ব্রেভিটি পছন্দ Inকরি IsInতবে এটি আরও ভাল হতে পারে।
উইনস্টন স্মিথ

50
একই ব্যবহার পদ্ধতি রয়েছে: (নতুন [] {1, 2, 3}) (ক) রয়েছে।
ম্যাক্স Toro,

4
আমি In<T>(...)এটির জন্যও ভেবেছিলাম এবং এটি স্ট্যান্ডার্ড লাইব্রেরির বাইরে সবচেয়ে কার্যকর এক্সটেনশন পদ্ধতি হিসাবে পেয়েছি। তবে নামটির সাথে আমার মতবিরোধ আছে In। একটি পদ্ধতির নাম এটি যা করে তা বর্ণনা করার কথা, তবে Inতা করে না। আমি এটি IsAnyOf<T>(...)বলেছি, তবে আমার ধারণাও IsIn<T>(...)যথেষ্ট হবে।
JBSnorro

160

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

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

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

ব্যাপ্তি এবং পদক্ষেপ - মারক গ্র্যাভেলকে তার অপারেটর স্টাফকে এটি সম্ভব করার জন্য ব্যাপক ধন্যবাদ thanks

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");

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

// <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()

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


1
ওটা সুন্দর! আপনার এটি গুগল কোড বা কোডপ্লেক্সে রেখে দেওয়া উচিত যাতে আমি আপনাকে কিছু প্যাচগুলি পাঠাতে পারি :-) আমি প্রতিশ্রুতি দিয়েছি এটি পাঠযোগ্য হবে :
পি

3
@ বোভিয়াম: আপনি ইতিমধ্যে কোডটি দেখতে পাচ্ছেন। প্রথম বাক্যে লিঙ্কটি অনুসরণ করুন - সম্পূর্ণ উত্স আছে।
জন স্কিটি

1
@ বোভিয়াম: আপনি বরং আপত্তি না করে কোড কোড.কম এ রেখে প্রকল্পটি নিজে পরিচালনা করবেন, যদি আপনি কিছু মনে করেন না। স্পষ্টতই আপনি যথোপযুক্ত বৈশিষ্ট্যটি বজায় রাখলে কোডেপ্লেক্সে রাখার লাইসেন্সের মধ্যে
জন স্কিটি

1
@ জন স্কিটি এটি এমআইটি লাইসেন্সের নিখরচায় সবার জন্য নিখরচায়। বাণিজ্যিকভাবে বা উন্মুক্ত উত্স। কেন বাহিনীতে যোগদান করবেন না এবং জনসাধারণের জন্য একটি এক্সটেনশন পদ্ধতির পাঠাগার তৈরি করবেন না।
বোভিয়াম

1
কেবলমাত্র আমি সেই লাইব্রেরিতে প্রচুর অন্যান্য বিট এবং টুকরো করি। আপনার প্রকল্পের জন্য এটির একটি অনুলিপি গ্রহণ করার জন্য আপনাকে স্বাগত জানানো হয়েছে, তবে আমি বরং আমার নিজস্ব প্রকল্পে একটি অনুলিপি রাখব।
জন স্কিটি

147

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

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);

দ্রুত অনুলিপি এবং পেস্ট জন্য এখানে যান ।

"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");

..


11
এটি অবশ্যই সংক্ষিপ্ত - তবে আপনার দলের কোনও নতুন সদস্যের কাছে অপঠনযোগ্য হবে।
জন স্কিটি

3
আমি মনে করি আপনার কোডের গ্র্যান্ডার স্কিমের পাঠযোগ্যতা আরও কিছু সংক্ষিপ্ত বিবৃতি যা দ্রুত দেখা / জিজ্ঞাসা করা যেতে পারে তার চেয়ে বেশি গুরুত্বপূর্ণ।
চক্রত

6
ব্যক্তিগতভাবে আমি একটি পৃথক ফর্ম্যাটর অবজেক্ট চাই, যেটি ছাত্রলীগ একবারের ধরণ পার্স করে আবার ব্যবহার করতে পারে। এটি পাঠযোগ্যতা এবং কর্মক্ষমতা বৃদ্ধি করবে। আমি ছাত্রলীগের দলকে জিজ্ঞাসা করেছি - আমরা দেখব ...
জন স্কিটি

3
এটি একটি এক্সটেনশন পদ্ধতি, অবশ্যই এটি দলের নতুন সদস্যদের কাছে অপঠনযোগ্য হতে চলেছে। আমি ভেবেছিলাম এই মজার স্টাফ দিয়ে ধারণাটি কি? নতুন সদস্যরা কীভাবে জানবেন যে আমরা কত চালাক?
মার্কজে

17
ঠিক আছে ... আমি কেবল এটি কার্যকর করতে গিয়েছিলাম এবং সাথে গিয়েছিলাম W সাথে - সুতরাং আপনি "এটি একটি {0}" পান। ("পরীক্ষা") সহ এবং এটি খুব পঠনযোগ্য এবং বোধগম্য। এফওয়াইআই
klkitchens

89

এগুলি কি কোন ব্যবহার?

public static bool CoinToss(this Random rng)
{
    return rng.Next(2) == 0;
}

public static T OneOf<T>(this Random rng, params T[] things)
{
    return things[rng.Next(things.Length)];
}

Random rand;
bool luckyDay = rand.CoinToss();
string babyName = rand.OneOf("John", "George", "Radio XBR74 ROCKS!");

এটি পাইথনগুলিকে এলোমেলোভাবে পছন্দ করে ch সুন্দর।
ড্যারেন টমাস

6
দম্পতি জিনিস: আমি যে কথা বলতে চাই OneOfগ্রহণ করা উচিত কোন IList<T> । তারপর আপনি সবসময় পারে এছাড়াও একটি জমিদার করে একটি লাগে paramsARG ও ঠিক সেই পাসের মধ্যে IList<T>জমিদার। আমি একটি উত্তর দিয়েছি (এখনই নীচে নীচে নীচে) NextBoolআপনার অনুরূপ পদ্ধতি সহ CoinToss, তবে একটি ওভারলোড যা একটি probabilityপরামিতি নেয় (যদি আমি 75% সময়ের কিছু হতে চাই তবে কী হবে?)। এছাড়াও, শুধু একটি নিট বাছাই: আপনার উদাহরণ কোড একটি নিক্ষেপ করা হবে NullReferenceExceptionযেহেতু randকখনোই সক্রিয়া করা হয়।
ড্যান টাও

3
+1 আমি সত্যিই এটি পছন্দ করি তবে আমি এর CoinTossসাথে প্রয়োগ করা পছন্দ করি rng.NextDouble() < .5কারণ অভ্যন্তরীণভাবে .Next(int)এটি তৈরি করা হয় .NextDouble()যাতে আপনি একটি কাস্ট, একটি * এবং একটি চেক সংরক্ষণ করতে পারেন।
ল্যাসে এসপোল্ট

76
public static class ComparableExtensions
{
  public static bool Between<T>(this T actual, T lower, T upper) where T : IComparable<T>
  {
    return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) < 0;
  }
}

উদাহরণ:

if (myNumber.Between(3,7))
{
  // ....
}

19
আমি এটিকে ভালবাসি তবে আমি সিদ্ধান্ত নেওয়ার চেষ্টা করছি যে সর্বনিম্ন মানকে অন্তত চেকটি অন্তর্ভুক্ত করা উচিত তবে সর্বোচ্চ মানটিতে একচেটিয়া করা উচিত if ভাবছি যদি তা বিভ্রান্ত হয়। ৫.দ্বয়ের মধ্যে (৫,১০) সত্য তবে ৫ (এর মধ্যে (1,5) মিথ্যা। এমনকি নিশ্চিত নয় যে পদ্ধতিতে কোনও সহযোগী সাহায্য করবে। Thougts?
স্টিভ হিনার

12
"ইসবিটুইন" নামটি কি আরও অর্থবোধ করবে না? এছাড়াও সম্ভবত একটি ইসবেটউইনইনক্লুসিভ এবং ইসবিটুইনইন এক্সক্লুসিভ করুন। যদিও কোনটি ডিফল্টরূপে গ্রহণ করবে তা ধারণা নেই।
fretje

2
@ স্টিভ: এটি যদি ডেটটাইম এক্সটেনশন হয় তবে এটি আরও বেশি অর্থবোধ করে।
জোয়েল কোহোর্ন

16
আমার কাছে বোঝানো হয়েছে: 5. মধ্যবর্তী (5,10) মিথ্যা, এবং 10. মধ্যবর্তী (5,10) মিথ্যাও ফেরত দেয়। এটাই আমার কাছে স্বাভাবিক মনে হয়।
অ্যালেক্স বারানোস্কি

3
আমার কাছে মনে হয় একাধিক ব্যক্তির কী প্রাকৃতিক তা সম্পর্কে বিভিন্ন ধারণা রয়েছে। এ কারণে সম্ভবত এটি পরিষ্কারভাবে বলা উচিত যা ব্যবহার করা হচ্ছে (অর্থাত্ ইনক্লুসিভ বনাম এক্সক্লুসিভ), কারণ এটি ত্রুটির একটি খুব সহজ উত্স হতে পারে।
ডেভিড মিয়াণী

58

এক্সটেনশন পদ্ধতি:

public static void AddRange<T, S>(this ICollection<T> list, params S[] values)
    where S : T
{
    foreach (S value in values)
        list.Add(value);
}

পদ্ধতিটি সমস্ত ধরণের জন্য প্রযোজ্য এবং আপনাকে পরামিতি হিসাবে তালিকায় একটি আইটেমের ব্যাপ্তি জুড়তে দেয়।

উদাহরণ:

var list = new List<Int32>();
list.AddRange(5, 4, 8, 4, 2);

15
এই

21
কেবল সংগ্রহের var list = new List<int>{5,4,8,4,2};
আরম্ভকারী

আপনার পদ্ধতির মধ্যে কেবল তালিকায় <T> .AdRange (IEnumerable <T> সংগ্রহ) না কেন?
রাউহটজ

8
@ উইল: আসলে, এটি গ্রহণ করা ভাল হবে ICollection<T>; তারপরে এটি ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, LinkedList<T>এবং HashSet<T>, কেবল সূচকযুক্ত সংগ্রহগুলি নয়।
ড্যান টাও

2
প্রাক -.net 4.0
সমবায়

55

কোডেপ্লেক্স প্রকল্পে এটি সর্বদা রেখে দিন।

এক্সএমএলে অবজেক্টগুলি সিরিয়ালাইজ করা / ডিসিজায়ালাইজ করা:

/// <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.
    }
}

8
আমি প্রথমটিকে ToXml()(যেমন ToString()) কল করতে প্রলুব্ধ হব
জে বাজুজি

1
ওপিকে ক্ষমা চাইলে তিনি যদি ইচ্ছাকৃতভাবে এটি লিখেছিলেন তবে মেমরিস্ট্রিমস এবং এক্সএমএলআরডার / এক্সএমএমএল রাইটারের ব্যবহার ওভারকিল ছিল। স্ট্রিংরেডার এবং স্ট্রিং রাইটার শ্রেণি এই অপারেশনের জন্য উপযুক্ত perfect
Portman

2
সাবধান, এটি থ্রেডসেফ নয়। স্থির সিরিয়ালিয়াস অভিধানে আপনার অ্যাক্সেসটি অবশ্যই সিঙ্ক্রোনাইজ করা উচিত।
ইয়ান শোয়ার্জ

2
@ ইয়ান, @ টি, আপনি যদি কেবল "থ্রেড স্ট্যাটিক" বৈশিষ্ট্য যুক্ত করেন তবে এটি অনেক সহজ। তারপরে প্রতিটি থ্রেডে একটি নতুন ক্যাশে তৈরি করা হবে। সিঙ্ক্রোনাইজেশনের দরকার নেই।
ফ্রাঙ্ক ক্রুয়েজার

1
@Jonathan সি ডিকিনসন: এটা এখানে দুটিই MSDN ডক্স থেকে মনে হচ্ছে, msdn.microsoft.com/en-us/library/... যে কন্সট্রাকটর যে ব্যবহার করা হয় (নতুন XmlSerializer (টাইপ)) একটি মেমরি লিক সমস্যা নেই। সুতরাং সম্ভবত ক্যাশিং কোডের প্রয়োজন নেই?
স্লোলাইফ

46

আইইনুমারেবলের জন্য ফরইচ

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 প্রত্যাবর্তনের প্রত্যাশা করে

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

আমি এটি তৈরি করেছি যাতে আমি আরও কার্যকরী শৈলীতে প্রোগ্রাম করতে পারি এবং আমি অবাক হয়ে গিয়েছিলাম যে তালিকার একটি ফোরইচ রয়েছে যখন আইনিম্যারেবল না করে।

কোডেপ্লেক্স প্রকল্পে এটি রাখুন


13
পোস্ট কেন LINQ এর IEnumerable <টি> Extensions একটি foreach অন্তর্ভুক্ত করবেন না করুন: stackoverflow.com/questions/317874/...
নিল

13
আমি পদ্ধতিটি ব্যবহার করার আগে এটি পড়ার পরামর্শ দিচ্ছি: ব্লগস.এমএসএনএন
এরিক্লিপার্ট

2
@ জেপবোচি: এটি স্রেফ মাইক্রোসফ্টের
ডেমোগজি

1
@ বাতিশচেভ এবং আপনার মন্তব্যটি মাইক্রোসফ্টের বিরুদ্ধে কেবল কুসংস্কার is এটি এরিকের লেখা কোনও শব্দই অকার্যকর করে না। কারও যুক্তি বৈধ বা অবৈধ করা হয় নি কেবল সে যে কোম্পানির পক্ষে কাজ করে তার জন্য।
jpbochi

1
যাইহোক, আমি একটি বিষয় পরিষ্কার করা যাক। আমি বলিনি যে আপনার এই ফোরএচ এক্সটেনশন পদ্ধতিটি ব্যবহার করা উচিত নয়। আমি কেবল বলেছি যে এরিক এটি ব্যবহার করবেন কিনা তা সিদ্ধান্ত নেওয়ার আগে আপনার যে পয়েন্টগুলি উন্মোচিত হয়েছিল তা বিবেচনা করা উচিত। আমি এটি পড়েছি এবং আমি এটি ব্যবহার না করার সিদ্ধান্ত নিয়েছি। আপনি আপনার কোড দিয়ে যা খুশি করতে মুক্ত free
jpbochi

43

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

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") বলতে পারেন, একটি "ডিফল্ট" মান নির্দিষ্ট করুন (আমি এটি "অন্যান্য" বলি) বা নাল (যেখানে টি: শ্রেণি) জিজ্ঞাসা করতে পারেন। আমি উভয় নিঃশব্দ ব্যতিক্রম মডেল এবং একটি সাধারণ ট্রাই পার্সে মডেল সরবরাহ করেছি যাতে গৃহীত পদক্ষেপের ইঙ্গিত দেয় এমন একটি বিল ফিরে আসে এবং একটি আউট প্যারাম নতুন মান ধারণ করে। সুতরাং আমাদের কোড এই জাতীয় জিনিস করতে পারে

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>();

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


64
ব্যক্তিগতভাবে, আমি কোডটির অনুরাগী নই যা ফলাফল নির্ধারণের জন্য চেষ্টা করে / চেষ্টা করে। উদ্দেশ্যযুক্ত যুক্তি, IMO এর বাইরে ঘটে যাওয়া ত্রুটিগুলির জন্য চেষ্টা / ধরা ব্যবহার করা উচিত। hmmmmm
খাঁটি.ক্রোম

আমি যদি আপনি কোডটি ব্যবহার না করতে চান তবে আমি এটি পোস্ট করতাম না! :)
TheSoftwareJedi

অবশেষে অদেখা কিছু something আমি এটা পছন্দ করি. :)
অ্যারিস ল্যাপসা

8
পরিবর্তনটি টাইপ () যখন রেফারেন্সটিকে "রূপান্তর" করতে না পারে তখন কেবলমাত্র সেই ব্যতিক্রমগুলি ধরার জন্য আপনার "ক্যাচ" ধারাটি কমপক্ষে পরিবর্তন করা উচিত। আমি মনে করি যে আপনি কোনও আউটফেমারি এক্সসেপশন, এক্সিকিউশনএজাইনএক্সসেপশন, থ্রেডআবার্টএক্সসেপশন বা অন্যকে রূপান্তর ত্রুটির হিসাবে বিবেচনা করতে চান না। এই জিনিসগুলি অন্যথায় ত্রুটিগুলি ট্র্যাক করা বেশ শক্ত হবে।
খ্রিস্টান.কে

2
আমি বিশ্বাস করি ToOrNullঠিক যেমন একই আচরণ রয়েছে ToOrDefault(যেমন, আপনি যদি ToOrDefaultকোনও ব্যর্থ রূপান্তর সহ একটি রেফারেন্স টাইপ করেন তবে তা ফিরে আসবে null)। তবে আরও বড় কথা, এটি আমার কাছে একরকম অপ্রয়োজনীয় বলে মনে হয় যেহেতু var s = myObject as stringএকই জিনিসটি সম্পাদন করে var s = myObject.ToOrNull<string>()- তবে সম্ভাব্যরূপে কোনওটি ধরতে হবে না InvalidCastException। আমি কিছু অনুপস্থিত করছি?
ড্যান টাও

43

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

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

এবং এটি এর মতো ব্যবহৃত হয়:

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

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


2
পাবলিক স্ট্যাটিক অকার্যকর লগ (এই ব্যতিক্রম আপত্তি) পড়া উচিত - সম্ভবত?
ক্রিস এস

আমি মনে করি এটি বিসিএল বা তৃতীয় পক্ষের ব্যতিক্রমগুলির পক্ষে ভাল, তবে আপনি যদি নিজের ব্যতিক্রম প্রকারগুলি রোল করেন তবে আপনি আপনার বেস ব্যতিক্রম শ্রেণিতে লগিং স্থাপন করতে পারেন। এইভাবে আপনাকে লগ () কল করতে হবে না।
si618

38
public static class StringExtensions {

    /// <summary>
    /// Parses a string into an Enum
    /// </summary>
    /// <typeparam name="T">The type of the Enum</typeparam>
    /// <param name="value">String value to parse</param>
    /// <returns>The Enum corresponding to the stringExtensions</returns>
    public static T EnumParse<T>(this string value) {
        return StringExtensions.EnumParse<T>(value, false);
    }

    public static T EnumParse<T>(this string value, bool ignorecase) {

        if (value == null) {
            throw new ArgumentNullException("value");
        }

        value = value.Trim();

        if (value.Length == 0) {
            throw new ArgumentException("Must specify valid information for parsing in the string.", "value");
        }

        Type t = typeof(T);

        if (!t.IsEnum) {
            throw new ArgumentException("Type provided must be an Enum.", "T");
        }

        return (T)Enum.Parse(t, value, ignorecase);
    }
}

একটি এনুমে একটি স্ট্রিং পার্স করতে দরকারী।

public enum TestEnum
{
    Bar,
    Test
}

public class Test
{
    public void Test()
    {
        TestEnum foo = "Test".EnumParse<TestEnum>();
    }
 }

ক্রেডিট স্কট ডোরম্যানের কাছে যায়

--- কোডপ্লেক্স প্রকল্পের জন্য সম্পাদনা করুন ---

আমি স্কট ডোরম্যানকে জিজ্ঞাসা করেছি যে তিনি কোডেপ্লেক্স প্রকল্পে তাঁর কোডটি প্রকাশ করতে আমাদের মনে করবেন কিনা? আমি তার কাছ থেকে এই উত্তর পেয়েছি:

এসও পোস্ট এবং কোডপ্লেক্স প্রকল্প উভয়কেই মাথা উঁচু করার জন্য ধন্যবাদ। আমি প্রশ্নে আপনার উত্তর upvated হয়েছে। হ্যাঁ, কোডটি বর্তমানে কোডপ্রজেক্ট ওপেন লাইসেন্সের ( http://www.codeproject.com/info/cpol10.aspx ) আওতায় পাবলিক ডোমেনে কার্যকরভাবে রয়েছে ।

কোডপ্লেক্স প্রকল্পে এটি অন্তর্ভুক্ত হওয়ার সাথে আমার কোনও সমস্যা নেই এবং আপনি যদি আমাকে প্রকল্পে যুক্ত করতে চান (ব্যবহারকারীর নাম sdorman হয়) আমি সেই পদ্ধতিটি যুক্ত করব কিছু অতিরিক্ত এনাম সহায়ক পদ্ধতি add


এই
এনাম

বাহ, আমি এনামগুলিতে স্ট্রিং ম্যাপ করার পদ্ধতিগুলি লিখেছি (সবেমাত্র নেট ব্যবহার শুরু করা)। ধন্যবাদ, এটি একেবারে সাহায্য করবে!
কেভিন

4
আপনি এই ToEnum <> () এর নামকরণও বিবেচনা করতে পারেন, কারণ এটি বস্তুর পরে আসে।
নিল

লক্ষ্য করুন Enum.TryParse <টি> এ নেট 4.0 যোগ করা হয়েছে - blogs.msdn.com/bclteam
ড্যান Diplo

1
আমি মনে করি না এই পদ্ধতিটি ট্রিম ব্যবহার করা উচিত। ইনপুট ছাঁটাই কলারের দায়িত্ব হওয়া উচিত।
কোডসইনচাউস

32

আমি এটিকে বেশ দরকারী বলে মনে করি:

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

আপনি এটি কোডপ্লেক্সে ব্যবহার করতে পারেন।


2
কেউ আমাদের কম উপহার হিসাবে এটি ব্যাখ্যা করার জন্য কি যথেষ্ট দয়াবান হতে পারে?
jpbochi

হাহাহাহা নিবন্ধটি পড়ুন (উপরে জোলের মন্তব্য) - মজার মজার কথা, তবে একই নৌকায় বসে থাকা (রিকভারিং শেষের দিকে, পাওলা শেষ নয়) এটি কেবল মজার মজার বিষয়! একবার একজন ঠিকাদারকে কোনও প্রকল্পে কাজ করার জন্য নিয়ে এসেছিলাম আমি ডিজাইনাইনার / লিড দেব অন - সে আমার সরাসরি নিয়ন্ত্রণে ছিল না, তবে আমার দলের কাজের তালিকা থেকে তাকে কাজ দেওয়া হয়েছিল। বোস তাকে উজ্জ্বল বলে প্রশংসা করেছিলেন (এমনকি পরে তাকে দেব নেতৃত্বে হিসাবে নিয়োগ দেয়!)। এটি তাদের কাছে কখনই প্রকাশ পায়নি যে তিনি লিখেছেন বা ডিজাইন করেছেন এমন প্রতিটি কোডের কোড এটি উত্পাদন করতে পারেনি এবং সমস্তই আমার দল কর্তৃক স্ক্র্যাচ থেকে পুরোপুরি আবার লিখতে হয়েছিল!
ওল্ফ5370

31

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();

5
আমি "সেটটাইম" নামটি "উইথটাইম" নামকরণ করার পরামর্শ দিচ্ছি কারণ এটি বাস্তবে এটি বিদ্যমান মানটিতে সেট করে না। ভাল অন্যথায় যদিও।
জন স্কিটি

28
ডেটটাইম.নিউ.প্রথম () - প্রথমে কি? এটি কেবলমাত্র নমুনা কোড থেকে স্পষ্ট।
ম্যাকেনির

2
খুব সুন্দর. তবে সম্মত হন যে নামগুলি আরও ভাল হতে পারে।
বোভিয়াম

পদ্ধতিটি সঠিকভাবে নথিভুক্ত করা থাকলে ডেটটাইম.নিউ.প্রথমটি ইন্টেলিসেন্সে যথেষ্ট পরিস্কার হবে।
রায়ান লুন্ডি

29

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


12 মোটামুটি বেসিক এক্সটেনশন পদ্ধতি। আমি মনো-শিলা দ্বারা কিছুটা পাতিত।
ম্যাকেনির

(আমি প্রকাশিত সংস্করণ সম্পর্কে কথা বলছি, যার পাওয়ার জন্য আপনার সোর্স-কন্ট্রোল ব্যবহার করা প্রয়োজন এটি নয়)
ম্যাকেনির

28

এখানে উপস্থাপনা বিন্যাসকরণের জন্য আমি প্রায়শই ব্যবহার করি।

public static string ToTitleCase(this string mText)
{
    if (mText == null) return mText;

    System.Globalization.CultureInfo cultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
    System.Globalization.TextInfo textInfo = cultureInfo.TextInfo;

    // TextInfo.ToTitleCase only operates on the string if is all lower case, otherwise it returns the string unchanged.
    return textInfo.ToTitleCase(mText.ToLower());
}

ওহো, পোকেমন ব্যতিক্রম হ্যান্ডলিং হ'ল থ্রেডআবার্ট এক্সেপশন ইত্যাদির মতো বিষয়গুলি লুকিয়ে রাখবে Please দয়া করে নির্দিষ্ট কিছু ধরুন।
জেবিআরউইলকিনসন

28

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

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();
        }
    }

এটি আমাকে পাইথন পিইপি 313 এর কথা মনে করিয়ে দেয়, যা রোথ
সংখ্যাসূচককে

25

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

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
        };
    }
}

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

24

উইনফর্ম নিয়ন্ত্রণগুলির জন্য:

/// <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));
}

আইসডিজাইনটাইম ব্যবহার:

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
    }
}

সেটড্রপডাউনউইথ ব্যবহার:

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();

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


1
যেমনটি উল্লেখ করা হয়েছে, এটি কেবল উইনফর্মের জন্য। এটি ডাব্লুপিএফের সাথে কাজ করতে পারে তবে কিছু সমস্যা রয়েছে (এমএসডিএন.মাইক্রোসফটকম / en-us/ library/… এ ডাব্লুপিএফ সম্পর্কে মন্তব্যে বর্ণিত )। আমি যে ডাব্লুপিএফ-এর সন্ধান পেয়েছি তার সর্বাধিক সমাধানটি জিক্সবিথব্লগসনেট / এলবগনিয়ন / অর্চিভ / ২০০৯ / ০৯ / ০৫ / ২-তে বর্ণিত হয়েছে (যদিও এটি একটি স্থির সম্পত্তি হিসাবে এটি আসলে একটি এক্সটেনশন পদ্ধতি হিসাবে কাজ করে না))
স্কোবি

23

The ThroIfArgumentIsNull হল সেই নাল চেকটি করার একটি দুর্দান্ত উপায় যা আমাদের সকলকে করা উচিত।

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");
    }
}

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


আমি এটিও পছন্দ করি, জনের এটির মধ্যে এটিও রয়েছে এবং আমি ছাতা থেকেও অনুরূপ কিছু ব্যবহার করি, "আর্গুমেন্টআইস" অংশটি ড্রপ করতে পারে।
cfeduke

হ্যাঁ! এটিও একটি
চাবুক

3
আপনি যদি কেবল 1 টি স্ট্রিং-আর্গুমেন্টের সাথে আর্গুমেন্টনাল এক্সসেপশন-কনস্ট্রাক্টর ব্যবহার করেন তবে সেই যুক্তিটি কেবলমাত্র প্যারামিটারের নাম হতে হবে, ত্রুটি বার্তা নয়। সুতরাং আপনার কোডটি দেখতে এইরকম হওয়া উচিত: যদি (اعتراض == নাল) নতুন আর্গুমেন্টনুল এক্সসেপশন (প্যারামিটারনেম) ফেলে দেয়;
টমি কারিয়ার

আমি এটির default(T)জন্য ব্যবহার করব এবং ক্লাসের প্রয়োজনীয়তা সরিয়ে ফেলব ।
জোয়েল কোহর্ন

1
@ জোয়েল: দেশীয় প্রকারের জন্য অ-ডিফল্ট মানগুলি নাল মানগুলির চেয়ে প্রায়শই বৈধ যুক্তি। নাল বিরুদ্ধে পরীক্ষা করা আমার কাছে ডিফল্টের চেয়ে চেক করার চেয়ে আরও বেশি বোঝা যায়। অবশ্যই, আমি কেবল Require.ThatArgument(input != null)বা বলে বা পুরো ধারণাটি সাধারণকরণ করেছি Require.ThatArgument(personId > 0)। এটি এত বেশি কোড নেয় না, এটি অনেক বেশি নমনীয় এবং এটি দুর্দান্তভাবে পড়ে। আমার কাছে অতিরিক্ত ওভাররাইড রয়েছে যা আপনি ত্রুটি বার্তা বা ব্যতিক্রম নিজেই কাস্টমাইজ করতে চান যখন এর জন্য ফানকস নেয়।
স্ট্রিপলিং ওয়ারিয়র

22

আমি সি # তে যাওয়ার সময় ভিজ্যুয়াল বেসিকের সাথে বিবৃতিটি মিস করি , তাই এখানে এটি যায়:

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

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

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

টাইপিং অনেকটা বাঁচায়!

এর সাথে তুলনা করুন:

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

কোডেপ্লেক্স প্রকল্পে রাখা


4
কেবল অনুমান করুন তবে আপনার টিটি যদি স্ট্রাক্ট হয় তবে কী হবে তা ভেবে দেখুন।
রাউহটজ

5
একই ফলাফল অর্জনের জন্য যেখানেই সম্ভব আমি সি # 3.0 সম্পত্তি আর্টিমাইজার সিনট্যাক্সটি ব্যবহার করি।
স্টিভ

3
@ চাচার্ট, এখানে একটি উদাহরণ। এটি কেবল তখনই প্রয়োগ হয় যখন বাটনটি এন = নতুন বোতাম {নাম = "বোতাম 1", প্রস্থ = 100, উচ্চতা = 20, সক্ষম = সত্য};
স্টিভ

1
যখন আপনার প্রচুর ইভেন্ট হুক হয় তখন এটি কার্যকর হবে কারণ সি # র সম্পত্তি প্রারম্ভিক সিনট্যাক্স ইভেন্টগুলিকে সমর্থন করে না।
গাবে

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

18

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

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])" ) );
}

আমি প্রায়শই এটি মূলধন হিসাবে কনজাকশন ব্যবহার করি

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( );

কোডেপ্লেক্স প্রকল্পে বিনামূল্যে ব্যবহারযোগ্য


পুঁজি আকারে সমষ্টিটি কার্য সম্পাদনের জন্য বেশ খারাপ, কারণ এটি অনেকগুলি স্ট্রিং উদাহরণ তৈরি করে। শব্দটি ব্যবহার করবেন না কেন? পরিবর্তে (1) সাবস্ট্রিং?
টমাস লেভেস্ক

17

আমি এটিকে সহায়ক বলে মনে করেছি

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

এটি কলিং কোডের নাল চেকটি সরিয়ে দেয়। আপনি এখন করতে পারে

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

হ্যাঁ, যদি কেউ "নাল অবজেক্ট প্যাটার্ন" ভুলে যান তবে এই পদ্ধতিটি এটি প্যাচ করার জন্য কার্যকর। সংগ্রহ কখনই শূন্য করা উচিত নয়।
পাভেল হোদেক

16

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

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

13
আপনার মুদ্রার জন্য দশমিকটি ব্যবহার করা উচিত অন্যথায় আপনি রাউন্ডিং ইস্যুগুলি পাবেন
অ্যান্ড্রু বুলক

প্লেইন স্ট্রিংয়ের পরিবর্তে প্যারামিটারে একটি
এনাম

15

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

স্নিপেট আপনাকে সহজভাবে করার অনুমতি দেয়:

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

যদি কোনও বাগ পান তবে মন্তব্যগুলিতে যুক্ত করুন। কোডেপ্লেক্স প্রকল্পে এটিকে নির্দ্বিধায় অন্তর্ভুক্ত করুন।

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();
            }
        }
    }
}

খুব দরকারী পদ্ধতি, তবে আমার মনে হয় না এটি হওয়া উচিত এবং এটি সম্প্রসারণের পদ্ধতি।
পপ ক্যাটালিন 15

আপনি যদি কোনও পাঠ্য সম্পাদক লেখেন তবে এটি সম্ভবত কোনও এক্সটেনশান পদ্ধতির নিশ্চয়তা দেয়, তবে আমি বেশিরভাগ সময় সম্মত হই যে এটি সম্ভবত কোনও স্থির বেসরকারী পদ্ধতির চেয়ে বেশি নয়
ক্রিস এস

15

এখানে আমি সবেমাত্র তৈরি করেছি।

// 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;

1
কি হবে যদি আমি চাই thingy.NullOr(t => t.Count), যেখানে Countকোন int? আপনাকে default(TReturn)নালার পরিবর্তে ফিরে আসা উচিত , এইভাবে আপনার classসীমাবদ্ধতার প্রয়োজন হবে না এবং এটি মান ধরণের জন্যও কাজ করবে
টমাস লেভসেক

2
তিন শ্রেণি হওয়া প্রয়োজন, অন্যথায় এই পুরো এক্সটেনশন পদ্ধতিটি কোনও অর্থ দেয় না (মানের ধরণগুলি নাল হতে পারে না)। এবং t.Count সহ আপনার উদাহরণ উপরের এক্সটেনশন পদ্ধতিতে কাজ করে। আপনি কি দ্বিতীয়বার দেখতে পারেন?
স্কোবি

@ স্কট: এটি একটি সাধারণ সমস্যার জন্য একটি দরকারী পদ্ধতি। তবে, আমি বিশ্বাস করি TReturn elseValue = default(TReturn)যে কেবল নেট নেট N.০ এ উপলব্ধ? আমার কাছে 3.5 এসপি 1 আছে এবং আমি কখনও এই নির্মাণটি দেখিনি (আমার সংকলকও নেই)। আমি এটি কেবল পদ্ধতির অভ্যন্তরে স্থানান্তরিত করেছি। তবে একটি ইস্যুটি হ'ল পদ্ধতিটির সাথে ব্যবহারের জন্য اعتراضযোগ্য কোনও প্রকারের বক্সিং বক্সিংয়ের ফলে অপ্রত্যাশিত ফলাফল পাওয়া যায় (0 বনাম প্রত্যাশিত নাল)।
জিম শুবার্ট

@ জিম: মূলশব্দটি ভিএস ২০০৫ default(T)সাল থেকে রয়েছে তবে আমি মনে করি ডিফল্ট পরামিতিগুলি একটি নতুন। নেট 4 বৈশিষ্ট্য। এর চারপাশের সহজ উপায়টির দুটি বৈকল্পিক হওয়া উচিত, একটি যা পরম নেয় এবং একটি এটি নয়। আমি উত্তরটি সিএলআর 2.0 সামঞ্জস্যপূর্ণ আপডেট করব update বক্সিং সম্পর্কে - যে বিষয় default। এটি কোনও মান ধরণের জন্য 0-সূচনাযুক্ত ডেটা হবে এবং সমস্ত রেফারেন্স ধরণের জন্য শূন্য হবে। একটি মান প্রকারের একটি ট্র্যাটার্নটি ফাংশনটির মাধ্যমে সমস্তভাবেই আনবক্সড থাকা উচিত।
স্কোবি

@ স্কট: আমার প্রশ্নটি ছিল ডিফল্ট প্যারামিটার সম্পর্কে, যা আমি কেবল রুবির মতো গতিময় ভাষায় দেখেছি। নালাগুলি প্রকারের বিষয়ে আমার বক্তব্যটি হ'ল x.Valueপ্রত্যাবর্তনটি নাল (যদি উদাহরণস্বরূপ, int?নাল ছিল) বা মান হিসাবে int?মানটি হওয়া উচিত। রিটার্নিং 0যখন int? x = nullউত্তীর্ণ হন এবং বস্তু boxed হয় একটি বিজোড় ক্ষেত্রে দেখা যায়। আমি এই নির্দিষ্ট ক্ষেত্রে যেমন প্রবাহী নিবারনেট এবং লিন্ফু (আমার মনে হয়) এর মতো লাইব্রেরিতে নালার প্রকারের জন্য একই রকম চেকগুলি দেখেছি, যা আপনাকে পূর্বের পরামর্শ অনুসারে শ্রেণিবদ্ধতা ছাড়তে দেয়।
জিম শুবার্ট

14

"কোডপ্লেক্স প্রকল্পে কোডটি রাখার জন্য দয়া করে আপনার উত্তরগুলি চিহ্নিত করুন mark"

কেন? সিসি-বাই-সা -২.২ এর অধীনে এই সাইটের সমস্ত স্টাফ , সুতরাং কেবলমাত্র আপনার এক্সটেনশন ওভারফ্লো প্রকল্পটি একই লাইসেন্সের আওতায় রাখুন এবং আপনি নির্দ্বিধায় এটি ব্যবহার করতে পারেন।

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

/// <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);
}

স্ট্রিং ইতিমধ্যে আইনেম্যুয়াল <চার> প্রয়োগ করে না? সুতরাং আপনাকে কেবল নতুন স্ট্রিং (ইনপুট। রিভার্স ()) ফেরত করতে হবে;
আয়ান গাল্লোয়ে

স্ট্রিংবিল্ডার ব্যবহার করে একটি বাস্তবায়ন দ্রুত হওয়া উচিত।
কোডসইনচাউস

1
মধ্যে @CodeInChaos দ্য স্থির করা মাপকাঠি stackoverflow.com/questions/228038 মাপা যে StringBuilder মন্থর।
মাইকেল স্টাম

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

2
আশা করি আপনি কোনও সরোগেট বা মিলিত অক্ষরগুলির মুখোমুখি হন নি।
ডাল

14

মাইএসকিএলডিটাআরডার থেকে মানগুলি টানতে গিয়ে আমি ক্লান্তিকর নাল চেক করে ক্লান্ত হয়ে পড়েছিলাম, সুতরাং:

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);
}

অবশ্যই এটি যে কোনও স্ক্লিলডেটাআরডার দিয়ে ব্যবহার করা যেতে পারে।


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

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);
}

2
এটি IDataReader এর এক্সটেনশন পদ্ধতি হিসাবেও কাজ করা উচিত।
হ্যাঙ্গ

2
প্রকৃতপক্ষে, সর্বাধিক সামঞ্জস্যের জন্য টাইপ IDataRecord এর "এই" পরামিতিটি তৈরি করুন। এর আমার সংস্করণে, আমার কাছে একটি ওভারলোড রয়েছে যা একটি অর্ডিনাল নেয়, যা ফিল্ডনাম সংস্করণ কল করে। নামের সাথে অনুসন্ধানের পরে "গেটআর্ডিনাল" সংরক্ষণ করে।
জোয়েল মুলার

একটি যথাযথ বাস্তবায়ন রয়েছে, যা যে কোনও মান ধরণের সাথে মোকাবিলা করতে পারে: রাবদুলিন
12/

দেখতে - ধন্যবাদ Rinat, আমি আসলে একটি একক জেনেরিক পদ্ধতি এই নিচে পেয়েছি stackoverflow.com/questions/303287
আদম Lassek

এই সমস্ত পদ্ধতি অপ্রয়োজনীয় বলে মনে হচ্ছে আপনি asনালার জন্য অনুমতি দিয়ে পাঠকের কাছ থেকে একটি মান পেতে কীওয়ার্ডটি ব্যবহার করতে পারেন । আপনি যদি ??অপারেটর হিসাবে নাল কোলেসিং অপারেটরকে একত্রিত করেন তবে কোনও মান ধরণের সরাসরি যেতে যাওয়ার জন্য আপনার নন-নাল ডিফল্ট মানও থাকতে পারে। দেখুন stackoverflow.com/questions/746767/...
stevehipwell

14

এটি আমার বিরক্ত হয়েছিল যে লিনকিউ আমাকে একটি অর্ডারবায় দেয় যা আইকম্পারারকে একটি আর্গুমেন্ট হিসাবে প্রয়োগ করে এমন একটি ক্লাস গ্রহণ করে, তবে একটি সাধারণ বেনামে তুলনামূলক ফাংশনে যেতে সহায়তা করে না। আমি তা সংশোধন করেছি

এই শ্রেণিটি আপনার তুলনামূলক ফাংশন থেকে একটি আইকোম্পার তৈরি করে ...

/// <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
}

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

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);
    }
}

আপনি যদি চান তবে কোডপ্লেক্সে এটি স্থাপন করতে আপনাকে স্বাগত জানাই।


13

এটি এমভিসির পক্ষে এটি প্রতিটিটিতে উপলব্ধ ভেরিয়েবলটিতে একটি <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);
    }
}

MvcContrib.FluentHtml দেখুন
অ্যারিস ল্যাপসা

এর পরিবর্তে সম্ভবত এটি লিটারাল দিয়ে নকল করা উচিত।
মার্ক হুরড

12

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

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 এক্সটেনশন পদ্ধতি: ডিবিএক্সটেনশন

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