問題タブ [extension-methods]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 拡張メソッドでデリゲートを暗黙的にキャストできないのはなぜですか?
何かを Action または Func に自動的にキャストする方法を見つけようとしていますが、思いつくのは次のようなものです。
これを行うには、より良い/より簡単な方法が必要です。何か考えはありますか?
c# - 拡張機能の使用: 長所と短所の比較検討
最近、醜いコードと思われるコードをクリーンアップする方法について質問しました。推奨事項の 1 つは、必要な機能を実行し、必要なものを返す拡張メソッドを作成することでした。私の最初の考えは「素晴らしい!拡張機能ってなんてクールなの...」と思いますが、もう少し考えてみると、拡張機能の使用について考え直し始めています...
私の主な懸念は、拡張機能がカスタムの「ショートカット」であり、他の開発者が従うのを難しくしているように見えることです。拡張機能を使用するとコード構文が読みやすくなることは理解していますが、カーテンの後ろの声に従うのはどうでしょうか?
たとえば、以前の質問のコード スニペットを見てみましょう。
次に、拡張機能に置き換えます。
次の構文を使用して呼び出します。
確かに便利な方法ですが、別のクラスオブジェクトのオーバーヘッドに本当に価値があるのでしょうか? 誰かが私のコード スニペットを再利用したいが、拡張機能を理解していない場合はどうなりますか? 同じ結果の構文を同じように簡単に使用できたはずです。
そこで、少し掘り下げて、拡張機能を使用することの長所と短所について話している記事をいくつか見つけました。興味のある方は、次のリンクをご覧ください。
どちらが良い方法なのか、一概には言えません。自分のやりたいことを実行するカスタム拡張機能、または同じタスクを達成するためのより多くのコードが表示されますか? 「本物の」開発者がこのトピックについてどう思うか知りたいです...
c# - C#、Linq2SQL:いくつかの範囲内の要素を検索するための述語を作成する
データベースにStuffという名前のプロパティがあり、Idというプロパティがあるとします。ユーザーから、選択したRangeオブジェクトのシーケンスを取得します(または、入力から作成します)。必要なIDを使用します。その構造体の簡略版は次のようになります。
したがって、たとえば、次のようになります。
次に、それを使用して、それらの間に値を持つものだけを選択する述語を作成したいと思います。たとえば、PredicateBuilderを使用すると、たとえば次のように実行できます。
その後:
どちらがうまくいくか!私が今やりたいのは、これらの述語を作成するためのジェネリック拡張メソッドを作成することです。このようなもの:
ここでの問題は、selector(ø)呼び出しが原因でNotSupportedExceptionでクラッシュすることです。Method 'System.Object DynamicInvoke(System.Object[])' has no supported translation to SQL.
それは理解できると思います。しかし、これを回避する方法はありますか?私が最終的にやりたいのは、私ができるようにすることです。
または、さらに良いことに、IQueryableを返すものを作成して、次のことを実行できるようにします。
それで、何かアイデアはありますか?私は本当にこれを機能させたいと思っています。そうでない場合は、コードのforeachブロックをたくさん取得して、述語を作成します...
注1:もちろん、DateTimeなどのようにint以上に拡張できればいいのですが、>=および<=演算子を使用するとどうなるかわかりません...CompareToはlinq-to-で機能しますかsql?そうでない場合は、2つ作成しても問題ありません。1つはint用、もう1つはDateTime用です。これは、ほとんどの場合、これが使用される型であるためです。
注2:レポートに使用され、ユーザーはさまざまなことに基づいて、何が出るかを絞り込むことができます。同様に、私はそれらの人々とそれらの日付のためにこのレポートが欲しいです。
c# - Moqを使用して拡張メソッドをモックするにはどうすればよいですか?
私は拡張メソッドの結果に依存するテストを書いていますが、その拡張メソッドの将来の失敗がこのテストを破ることを望んでいません。その結果をあざけるのは当然の選択のように見えましたが、 Moqは静的メソッド(拡張メソッドの要件)をオーバーライドする方法を提供していないようです。Moq.ProtectedとMoq.Stubにも同様のアイデアがありますが、このシナリオでは何も提供されていないようです。私は何かが足りないのですか、それとも別の方法でこれを行う必要がありますか?
これは、通常の「オーバーライド不可能なメンバーに対する無効な期待値」で失敗する簡単な例です。これは、拡張メソッドをモックする必要があるという悪い例ですが、そうする必要があります。
代わりにIsolatorを使用することを提案する可能性のあるTypeMockジャンキーについては、TypeMockが目隠しをして醜い仕事をすることができるように見えるので、努力に感謝しますが、予算はすぐには増えません。
c# - コードを含む文字列から述語本体を動的に定義する方法はありますか?
これはおそらくばかげた質問ですが、ここに行きます。データベースのVARCHAR列から解析された文字列、または任意の文字列から述語<T>を動的に構築できるようにしたいと思います。たとえば、データベースの列に次の文字列が含まれているとします。
これらのコード/文字列値は、汎用「e」の可能なプロパティが何であるかを認識し、ブール値を返す必要があることを認識して、データベースに格納されます。次に、魔法のような素晴らしいファンタジーの世界では、次のように、述語が何であるかを知らなくてもコードを実行できます。
またはラムダ化:
おそらくこれほど単純なことはないでしょうが、おそらくReflection.Emitを使用して、テキストから動的にデリゲートコードを作成し、それをFindAll <T>(またはその他の匿名/拡張)メソッドに渡す方法はありますか?
c# - LINQ を使用してループを置き換えるのは賢明ですか?
LINQ のおかげで非常に多くの機能を利用できるようになったので、どの構文が適しているのか疑問に思っています。たとえば、次の方法を見つけました (良い例だと思いました)。
これを LINQ アプローチに変換すると、次のようになります (テストされていません)。
どちらを見て維持したいですか? これはクレイジーですか、それとも天才ですか?
sql - 拡張メソッドによって LINQ to SQL がだまされるのはなぜですか? 今何?
Event
私のクラスを考えてみましょう。私はDateTime
を UTC 日付として DB に保存します。特定のタイムゾーンの現在の日付に基づいてフィルタリングされた範囲を返したいだけです-簡単ですよね?
これはうまくいきます:
これもうまくいきます:
..さらに、タイムゾーンの要件も満たしています。
だからここで私はこの特定の変換をこの拡張メソッドに移すことができると考えています:
これは動作しません:
.. そして、私はこの NotSupportedException を取得します: Method 'System.DateTime RiyadhTimeFromUtc(System.DateTime)' has no supported translation to SQL.
同一のコードが拡張メソッドにない場合、コンパイラは喜んでSQLに変換したため、これは明らかにゴミです。
以前、特定のタイプと最近の DateTime で「SQL への変換がサポートされていません」という問題に遭遇しました。しかし、上記の私のテストとこのリンクは、AddHours メソッドが SQL 変換でサポートされるべきであることを証明しています。
ここで私が間違っていること(またはこの問題に対する別の回避策)を誰かが教えてくれたら、本当に感謝しています。
c# - C# には拡張プロパティがありますか?
C# には拡張プロパティがありますか?
たとえば、返される拡張プロパティをDateTimeFormatInfo
calledに追加できますか?ShortDateLongTimeFormat
ShortDatePattern + " " + LongTimePattern
c# - IEnumerable の次の N 要素を選択する
長さ N の S と呼ばれる IEnumerable があるとします。S から長さ n <= N のすべての連続したサブシーケンスを選択したいと思います。
たとえば、S が文字列の場合、これは非常に簡単です。長さ n の (S.Length - n + 1) サブシーケンスがあります。たとえば、「abcdefg」は長さ (7) であるため、長さ (3) の (5) 部分文字列 (「abc」、「bcd」、「cde」、「def」、「efg」) があることを意味します。
しかし、S は任意の IEnumerable である可能性があるため、このルートは開いていません。これを解決するために拡張メソッドを使用するにはどうすればよいですか?