C#のお気に入りの拡張メソッドは何ですか?(codeplex.com/extensionoverflow)


478

あなたの優れたお気に入りの拡張メソッドを投稿する答えのリストを作ってみましょう。

要件は、完全なコードを投稿する必要があり、例とその使用方法の説明です。

このトピックへの高い関心に基づいて、Codeplexに extensionoverflowというオープンソースプロジェクトをセットアップしました

Codeplexプロジェクトにコードを配置するには、回答に同意のマークを付けてください。

リンクではなく、完全なソースコードを投稿してください。

Codeplexニュース:

24.08.2010 Codeplexページがここにあります:http ://extensionoverflow.codeplex.com/

11.11.2008 XmlSerialize / XmlDeserialize実装されユニットテストが行​​われました

2008年11月11日より多くの開発者のための余地がまだあります。;-) 今すぐ参加!

11.11.2008 3番目の寄稿者がExtensionOverflowに参加しました。BKristensenようこそ

11.11.2008 FormatWith実装されユニットテストが行​​われました

2008/09/11 2番目の寄稿者がExtensionOverflowに参加しました。チャクリットようこそ

09.11.2008さらに開発者が必要です。;-)

09.11.2008 ThrowIfArgumentIsNull実装されCodeplexユニットテストが行われました。


これで、最初のコードがCodeplexサイトにコミットされました。
ボビウム2008年

エリックは残念ながらすべてがcodeplexで始まっています。とにかく参加してください。
ボビウム2008

3
よさそうだ。静的クラスの命名についてコメントがあります。<type> Extensionsに名前を付けることは、あまり有益ではありません。たとえば、StringExtensionsはフォーマットとXMLの両方を保持します。クラスに名前を付けた方が、その型を拡張する理由がわかると思います。たとえば、UnixDateTimeConversionsです。あなたはそれがUnix時間との間で変換するためのメソッドを保持していると合理的に推測できます。ちょっとした考え!
ecoffey 2010

C#拡張メソッドの詳細については、このURLを確認してください。planetofcoders.com/c
Gaurav Agrawal

回答:


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
たぶん "EqualsAnyOf"は "In"よりも良い名前でしょうか?
Tom Bushell、2010年

10
私はそれが好きかわかりません-の簡潔さが好きですInが、多分IsInもっと良いでしょう。
ウィンストン・スミス

50
同じContainsメソッドを使用する:(new [] {1、2、3})。Contains(a)
Max Toro

4
In<T>(...)も同様に考え、標準ライブラリの外で最も便利な拡張メソッドであることがわかりました。しかし、私は名前と対立していますIn。メソッド名は、それが何をするかを説明することになっていますが、Inそうではありません。私はそれを呼び出しましたIsAnyOf<T>(...)が、私IsIn<T>(...)も同様に十分だと思います。
JBSnorro 2011

160

MiscUtilプロジェクトにはさまざまな拡張メソッドがあります(完全なソースはそこで入手できます-ここでは繰り返しません)。私のお気に入り、その一部には他のクラス(範囲など)が含まれます:

日付と時刻のもの-主に単体テスト用。私がそれらを本番で使用するかどうかはわかりません:)

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

レンジとステッピング- これを可能にしてくれたオペレーターの Marc 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 to XML:

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

LINQをプッシュする-ここで説明するには時間がかかりすぎますが、検索してください。


1
それはすばらしい!私はあなたにいくつかのパッチを送ることができるようにそれをグーグルコードまたはCodePlexに置くべきです:-)私はそれが読めると約束します:-P
chakrit

3
@ボビウム:あなたはすでにコードを見ることができます。最初の文のリンクをたどってください-完全なソースがあります。
Jon Skeet、

1
@bovium:気にしない場合は、自分で行い、code.google.comに配置してプロジェクトを自分で管理します。明らかに、適切な帰属を維持していれば、Codeplexに配置するライセンスの範囲内ですが、必死でなければ、すぐに整理したいと思います:)
Jon Skeet

1
@ジョンスキート。誰もが無料で使用できるMITライセンスの下に置かれています。商用またはオープンソース。力を合わせて、一般向けの拡張メソッドライブラリを作成してみませんか。
ボビウム2008年

1
そのライブラリで他の多くの要素を実行しているからです。プロジェクトのすべてのコピーを作成することはできますが、自分のプロジェクトにも1つのコピーを保持したいです。
Jon Skeet

147

string.Formatショートカット:

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
これは確かに短いですが、チームの新しいメンバーには判読できません。
Jon Skeet、

3
読みやすさは、すぐに調べたり尋ねたりできるいくつかの省略形のステートメントよりも、コードのより壮大なスキームで重要だと思います。
chakrit 2008年

6
個人的には、BCLが一度のパターンを解析して再利用できる別のFormatterオブジェクトが欲しいです。読みやすさとパフォーマンスが向上します。私はBCLチームに尋ねました-わかります...
ジョンスキート

3
これは拡張メソッドですが、もちろん、チームの新しいメンバーには読めなくなります。これはこの機知に富んだもののアイデアだと思いましたか?新しいメンバーは他にどのように私たちの賢さを知るでしょうか?
MarkJ 2009

17
わかりました...これを実行に移して.With-を使用しました。「これは{0}」です。FYI
klkitchens 2009年

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

これはpythonのrandom.choice(seq)関数を模倣しています。いいね。
ダレントーマス

6
カップルのもの:どれでもOneOf受け入れることを お勧めしますIList<T>。次に、常に引数を受け取り、それをオーバーロードに渡すオーバーロードを常に持つことできます。私はあなたのに似た方法で答えを出しました(今すぐ下に向かって)が、パラメーターを取るオーバーロード(何かが75%の時間発生したい場合はどうしますか?)また、単なる抜粋:サンプルコードでは、初期化されていないため、スローされます。paramsIList<T>NextBoolCoinTossprobabilityNullReferenceExceptionrand
Dan Tao

3
+1私はこれが本当に好きですが、内部で作成されるため、キャスト、*、およびチェックを保存するためCoinToss、で実装するrng.NextDouble() < .5ことを好みます。.Next(int).NextDouble()
Lasse Espeholt、2009

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
私はこれが好きですが、境界チェックを最小値に含めて最大値に限定することが正しいかどうかを判断しようとしています。混乱を招くのではないでしょうか。5.Between(5,10)はtrueですが、5.Between(1,5)はfalseです。仲間内のメソッドが役立つかどうかさえわからない。どうした?
スティーブHiner

12
「IsBetween」という名前はもっと意味がありませんか?また、IsBetweenInclusiveおよびIsBetweenExclusiveを作成することもできます。ただし、どれをデフォルトにするかはわかりません。
fretje 2009年

2
@Steve:日時拡張である場合、より理にかなっています。
Joel Coehoorn、2009年

16
暗黙のうちに私には:5.Between(5,10)はfalseを返し、10.Between(5,10)もfalseを返します。それは私にとって自然なことです。
Alex Baranosky、2009

3
何が自然なのかについて、複数の人が異なる考えを持っているように私には思えます。このため、これは非常に簡単なエラーの原因となる可能性があるため、おそらく何が使用されているか(つまり、包括的または排他的)を明示する必要があります。
David Miani、

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
このIList <T>としてより良い

21
コレクションの初期化子を使用するだけです=>var list = new List<int>{5,4,8,4,2};
Arnis Lapsa

メソッド内でList <T> .AddRange(IEnumerable <T>コレクション)を呼び出すだけではどうですか?
Rauhotz

8
@Will:実際には、を受け入れるのが最善ICollection<T>です。それはまた、例えば、上の使用、できることLinkedList<T>HashSet<T>ちょうどインデックス付きのコレクションではなく。
Dan Tao

2
.net 4.0より前のバージョンで共分散許可するように編集
BlueRaja-Danny Pflughoeft

55

ぜひ、これをcodeplexプロジェクトに入れてください。

オブジェクトのXMLへのシリアライズ/デシリアライズ:

/// <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())を呼びたくなります
Jay Bazuzi

1
OPが意図的にこの方法で記述した場合、OPに謝罪しますが、MemoryStreamsおよびXmlReader / XmlWriterの使用はやりすぎでした。StringReaderおよびStringWriterクラスは、この操作に最適です。
ポートマン、

2
注意してください、これはスレッドセーフではありません。静的シリアライザ辞書へのアクセスを確実に同期する必要があります。
ヤンシュワルツ

2
@ Yann、@ T、「静的スレッド」属性を追加するだけの方がはるかに簡単です。次に、スレッドごとに新しいキャッシュが作成されます。同期の必要はありません。
フランク・クルーガー、

1
@Jonathan C Dickinson:MSDNのドキュメントmsdn.microsoft.com/en-us/library/…から、使用されているコンストラクター(新しいXmlSerializer(type))にはメモリリークの問題がないようです。それで、キャッシングコードは必要ないのでしょうか?
slolife 2010

46

IEnumerablesのForEach

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にはForEachがあり、IEnumerableにはないことに驚きました。

これをcodeplexプロジェクトに入れます


13
ポストLINQのIEnumerableを<T>は拡張子がするForEachが含まれていない理由について:stackoverflow.com/questions/317874/...
ニール

13
私はこの方法を使用する前にこれを読んでお勧めします。blogs.msdn.com/ericlippert/archive/2009/05/18/...
jpbochi

2
@jpbochi:これは単なるマイクロソフトのデマゴジーです
abatishchev

1
@abatishchevそして、あなたのコメントはマイクロソフトに対する偏見にすぎません。エリックが書いた単語を無効にするものではありません。誰かが働いている会社があるからといって、誰かの議論が有効にも無効にもされません。
jpbochi

1
ちなみに、一点はっきりさせておきます。このForEach拡張メソッドを使用しないでくださいとは言いませんでした。使用するかどうかを決める前に、エリックが明らかにした点を検討する必要があると私は言った。私はそれを読み、それを使用しないことにしました。コードで好きなことを自由に実行できます。
jpbochi

43

あなたができる私の変換拡張:

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

これは、TheSoftwareJedi.comに投稿されているとおりです。

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」を呼び出す)を要求するか、「デフォルト」の値を指定(「その他」と呼ぶ)するか、null(T:クラス)を要求できます。また、サイレント例外モデルと、実行されたアクションを示すブール値を返し、outパラメーターが新しい値を保持する典型的な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分ほど試してみました。


64
個人的に、私は結果を決定しようとする/キャッチするコードのファンではありません。意図したロジックIMOの外部で発生するエラーには、try / catchを使用する必要があります。hmmmmm
Pure.Krome

私があなたにコードを使わせたくないなら、私はそれを投稿しなかっただろう!:)
TheSoftwareJedi 2008

ついに見えなくなったもの。私はそれが好きです。:)
Arnis Lapsa 2009年

8
少なくとも「catch」句を変更して、参照を「変換」できないときにChangeType()が発生させる例外のみをキャッチするようにしてください。OutOfMemoryException、ExecutionEngineException、ThreadAbortExceptionなどが変換エラーとして扱われるのは望ましくないと思います。そうしないと、エラーを追跡するのがかなり難しくなります。
Christian.K

2
私はとToOrNull同じ動作をすると信じていToOrDefaultます(つまり、ToOrDefault変換が失敗した参照型を呼び出すと、が返されますnull)。しかし、より重要なvar s = myObject as stringことに、と同じことを達成するので、私には冗長であるように見えますが、var s = myObject.ToOrNull<string>()をキャッチする必要がない可能性がありInvalidCastExceptionます。何か不足していますか?
Dan Tao

43

例外をログに記録するための拡張メソッドがあります。

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

そしてそれはこのように使用されます:

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

【2回投稿してすみません】2つ目はよりよく設計されています:-)]


2
多分、static static void Log(this Exception obj){}を読むべきですか?
Chris S、

これはBCLまたはサードパーティの例外に適していると思いますが、独自の例外タイプをロールする場合は、基本例外クラスにロギングを配置できます。そうすれば、Log()を呼び出すことを覚えておく必要はありません。
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);
    }
}

文字列をEnumに解析するのに便利です。

public enum TestEnum
{
    Bar,
    Test
}

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

クレジットはスコット・ドーマンに送られます

--- Codeplexプロジェクト用に編集---

スコットドーマンに、彼のコードをCodeplexプロジェクトで公開してもらえるかどうか尋ねました。これは私が彼から得た返事です:

SOポストとCodePlexプロジェクトの両方のヘッドアップに感謝します。質問に対するあなたの答えを賛成しました。はい、コードは事実上、現在CodeProject Open License(http://www.codeproject.com/info/cpol10.aspx)の下でパブリックドメインにあります。

これがCodePlexプロジェクトに含まれていることに問題はありません。私をプロジェクトに追加する場合(ユーザー名はsdorman)、そのメソッドといくつかの追加の列挙型ヘルパーメソッドを追加します。


この列挙型解析のシナリオは常に出てきます...これを私のlibに入れなければなりません:-)
chakrit 2008年

うわー、文字列を列挙型にマップするメソッドを書いてきました(.NETを使い始めたばかりです)。ありがとう、これは絶対に役立ちます!
ケビン

4
また、このToEnum <>()はオブジェクトの後に来るため、名前を付けることも検討してください。
Neil、

Enum.TryParse <T>がNet 4.0に追加されたことに注意してください-blogs.msdn.com/bclteam
Dan Diplo

1
この方法ではトリムを使用すべきではないと思います。入力のトリミングは、呼び出し元の責任です。
CodesInChaos 2010年

32

これはかなり便利だと思います:

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

CodePlexで使用できます。


2
誰かが私たちのあまり才能のない人にそれを説明するのに十分親切にできますか?
jpbochi

hahaha記事(上記のJoelのコメント)を読んでください-おかしいtrueですが、(Paulaエンドではなく受信側で)ほぼ同じボートに乗っていたので、振り返ってみると面白いだけです!かつて請負業者がプロジェクトに取り掛かるように依頼されたとき、私は設計担当者/開発主任でした-彼女は私の直接の管理下にはありませんでしたが、私のチームのワークリストから仕事を割り当てられました。ボスは彼女を素晴らしいと称賛しました(後で彼女をDev Leadとして再び雇うことさえ!)。彼女が書いたり設計したりしたすべてのコードが製品化されたわけではなく、すべて私のチームが完全にゼロから書き直さなければならなかったことは彼らに気づかれることはありませんでした。
Wolf5370、2012年

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
「SetTime」の名前を「WithTime」に変更することをお勧めします。これは、実際には既存の値に設定されていないためです。それ以外はいい。
Jon Skeet、

28
DateTime.Now.First()-最初に何?サンプルコードからのみ明らかです。
Mackenir 2008年

2
非常に素晴らしい。ただし、名前の方がはるかに優れている可能性があることに同意してください。
ボビウム2008年

メソッドが十分に文書化されている場合、DateTime.Now.FirstはIntellisenseで十分に明確になります。
ライアンランディ

29

gitorious.org/cadenzaは、私が見た中で最も便利な拡張メソッドのいくつかの完全なライブラリです。


12のかなり基本的な拡張メソッド。私はモノロックに少し圧倒されています。
Mackenir 2008年

(私はリリースされたバージョンについて話しているのであって、取得するためにソース管理を使用する必要があるものではない)
mackenir 2008年

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

おっと、ポケモンの例外処理はThreadAbortExceptionなどの問題を非表示にします。何か特定のものをキャッチしてください。
JBRウィルキンソン2010

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

pythonでローマ数字リテラルを含めるようにエイプリルフールのジョークだったのPython PEP 313、のことを思い出すこと:python.org/dev/peps/pep-0313
torial

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

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

私は言及するのを忘れていました、Codeplexでこれらを自由に使ってください...


1
前述のように、これはWinForms専用です。WPFで動作する可能性がありますが、問題があります(msdn.microsoft.com/en-us/library/…の WPFに関するコメントに記載されています)。私が見つけたWPFの最良の解決策は、geekswithblogs.net / lbugnion / archive / 2009/09/05 /…に記述されています(ただし、これは静的プロパティであるため、実際には拡張メソッドとして機能しません。)
scobi

23

ThrowIfArgumentIsNullは、私たち全員が実行する必要があるnullチェックを実行する良い方法です。

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プロジェクトでこのコードを使用しても問題ありません


私もこれが好きで、ジョンは彼の中にそれを持っています、そして私は傘から同様のものを使用します、「ArgumentIs」の部分を落とすために立つことができます。
cfeduke、2008年

うん!これもkewl拡張メソッドです:)
Pure.Krome 2008年

3
ArgumentNullException-constructorを1つのstring-argumentだけで使用する場合、その引数は、エラーメッセージではなく、パラメータ名のみである必要があります。したがって、コードは次のようになります。if(obj == null)throw new ArgumentNullException(parameterName);
Tommy Carlier、2009年

default(T)これを使用して、クラスの要件を削除します。
Joel Coehoorn、2010年

1
@Joel:ネイティブ型のデフォルト以外の値は、null値よりも多くの場合、正当な引数です。nullに対するチェックは、デフォルトに対するチェックよりも意味があります。もちろん、Require.ThatArgument(input != null)またはと言って全体のアイデアを一般化するだけRequire.ThatArgument(personId > 0)です。それほど多くのコードを必要とせず、はるかに柔軟で、読みやすくなります。エラーメッセージまたは例外自体をカスタマイズするときにfuncsを使用する追加のオーバーライドがあります。
StriplingWarrior 2010

22

私は欠場のステートメントを使用してVisual Basicのを 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!";

codeplexプロジェクトに入れる


4
推測だけですが、Tが構造体の場合はどうなるか考えてください。
ラウホッツ2009年

5
また、同じ結果を得るために、可能な限りc#3.0プロパティ初期化構文を使用しています。
スティーブ

3
@chakrit、ここに例があります。オブジェクトButton n = new Button {Name = "Button1"、Width = 100、Height = 20、Enabled = true};を作成する場合にのみ適用されます。
スティーブ、

1
これは、C#のプロパティ初期化構文がイベントをサポートしていないため、フックするイベントが多い場合に役立ちます。
Gabe

1
これは、プロパティ初期化子の外でも有用です。これは、新しいオブジェクトを作成するときにのみ使用できるためです。この拡張機能は、以前に作成されたオブジェクトで機能します。
Brady Moritz

18

camelCaseWordまたはPascalCaseWordを受け取り、それを「表現する」、つまりcamelCaseWord => camel Case Word

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

私はよくそれをCapitalizeと組み合わせて使用​​します

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プロジェクトで無料で使用できます


CapitalizeのAggregateは、多くの文字列インスタンスを作成するため、パフォーマンスにかなり悪影響を及ぼします。代わりにword.Substring(1)を使用しないのはなぜですか?
トーマスレベスク

17

これは役に立ちました

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

呼び出しコードのnullチェックを削除します。あなたは今できる

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

はい、誰かが「Null Object Pattern」を忘れた場合、このメソッドはパッチを適用するのに役立ちます。コレクションをnullにすることはできません。
Pavel Hodek 2011

16

doubleを、指定されたカルチャを使用してフォーマットされた文字列に変換します。

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
通貨には小数を使用する必要があります。そうしないと、丸めの問題が発生します
Andrew Bullock

プレーンな文字列の代わりにパラメータでEnumを使用するのはどうですか
Rulas

15

以下は、Rick 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();
            }
        }
    }
}

非常に便利なメソッドですが、拡張メソッドである必要はないと思います。
ポップカタリン

テキストエディターを作成している場合は、おそらく拡張メソッドが必要ですが、ほとんどの場合、それは静的プライベートメソッド
Chris S

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

これは、これよりも流暢で(IMO)読みやすいです。

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

1
私がしたい場合はどのようなthingy.NullOr(t => t.Count)、どこCountintがありますか?default(TReturn)nullではなく返す必要があります。そうすれば、class制約が不要になり、値型でも機能します
Thomas Levesque

2
TInはクラスである必要があります。そうでない場合、この拡張メソッド全体は意味がありません(値の型をnullにすることはできません)。そして、t.Countを使用した例は、上記の拡張メソッドで機能します。もう一度見てください。
scobi

@スコット:これは一般的な問題に役立つ方法です。ただし、TReturn elseValue = default(TReturn).NET 4.0でのみ使用できると思いますか?私は3.5 SP1を持っていますが、その構造を見たことはありません(コンパイラーも持っていません)。これをメソッド内に移動しました。ただし、1つの問題は、メソッドで使用するためにnull許容型をオブジェクトにボックス化すると、予期しない結果(0と予想されるnull)が生じることです。
ジムシューベルト

@ジム:default(T)キーワードはVS2005から存在していますが、デフォルトのパラメーターは.NET 4の新機能だと思います。それを回避する簡単な方法は、2つのバリアントを持つことです。1つはparamを取り、もう1つは取りません。回答をCLR 2.0互換に更新します。ボクシングに関して-それはのポイントですdefault。値型の場合は0で初期化されたデータになり、すべての参照型の場合はnullになります。値型のTReturnは、関数全体を通じてボックス化されていない状態である必要があります。
scobi

@スコット:私の質問は、Rubyのような動的言語でしか見たことのないデフォルトのパラメーターに関するものでした。null可能型に関する私のポイントは、x.Valuereturnはnull(たとえば、int?nullだった場合)または値がある場合int?は値を返す必要があるということです。が渡されてオブジェクトにボックス化された0ときに戻るのint? x = nullは奇妙なケースです。この特定のケースでは、流暢なnhibernateやlinfuなどのライブラリでnull許容型の同様のチェックを確認しました。これにより、以前に提案されたようにクラス制約を削除できます。
ジムシューベルト

14

「Codeplexプロジェクトにコードを入れるために、あなたの回答に同意のマークを付けてください。」

どうして?CC-by-sa-2.5の下にあるこのサイトのすべてのものなので、拡張ライセンスオーバーフロープロジェクトを同じライセンスの下に置くだけで、自由に使用できます。

とにかく、これはこの質問に基づいたString.Reverse関数です。

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

StringはすでにIEnumerable <char>を実装していませんか?したがって、新しいString(input.Reverse());を返す必要があるだけです。
Iain Galloway

StringBuilderを使用した実装の方が高速です。
CodesInChaos

1
@CodeInChaos stackoverflow.com/questions/228038のベンチマークは、StringBuilderが遅いことを測定しました。
Michael Stum

あなたが正しい。スレッドセーフの要件(おそらくToStringによって返される文字列の不変性を保証するため)は、StringBuilderを大幅に遅くするようです。
CodesInChaos 2010年

2
サロゲートや組み合わせ文字に遭遇しないことを願っています。
dalle

14

MySqlDataReaderから値を取得しているときに、面倒なnullチェックにうんざりしました。

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でも使用できます。


hangyとJoeの両方がこれを行う方法についていくつかの良いコメントをしており、それ以来私は異なるコンテキストで同様のものを実装する機会を得たので、ここに別のバージョンがあります。

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の拡張メソッドとしても機能するはずです。
2008年

2
実際には、互換性を最大にするために、IDataRecordタイプの「this」パラメーターを作成します。これの私のバージョンでは、序数を取るオーバーロードがあり、fieldNameバージョンが呼び出します。「GetOrdinal」を保存してから、名前による検索を行います。
Joel Mueller、

任意の値タイプを扱うことができ、適切な実装は、あります: rabdullin.com/journal/2008/12/6/...
Rinat Abdullin

参照-おかげRinatは、私が実際には単一の一般的な方法には、このダウンを持っているstackoverflow.com/questions/303287
アダムLassek

asキーワードを使用してnullを許可するリーダーから値を取得できるため、これらのメソッドはすべて不要であるように見えます。nullの合体??演算子をas演算子と組み合わせると、値の型に直接移動するための非nullのデフォルト値を持つこともできます。stackoverflow.com/questions/746767/…を
stevehipwell

14

LINQが、IComparerを実装するクラスを引数として取るOrderByを提供するが、単純な匿名の比較関数を渡すことをサポートしていないことに私は苛立ちました。私はそれを修正しました。

このクラスは、比較関数から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
}

...そしてこれらの拡張メソッドは、列挙型の新しいOrderByオーバーロードを公開します。これはLINQ to SQLでは機能しないと思いますが、LINQ to Objectsにとっては優れています。

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に配置してもかまいません。


13

これはMVC用で、すべてので使用可能な変数に<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をチェックしてください
Arnis Lapsa 2009年

これはおそらく代わりにリテラルで複製する必要があります。
Mark Hurd、

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拡張メソッド:DbExtensions

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.