3

最近、いくつかの C# 拡張機能をいじっていて、質問があります。IEnumerables の「ForEach」拡張機能を作成しました (List には Linq からのものがありますが、IEnumerables には存在しません)。これは非常に単純なものです。

public static void ForEach<T> (this IEnumerable<T> source, Action<T> action)
{
    foreach (T element in source) {
        action(element);
    }
}

そして、あなたはそれを次のように呼びますMyArray.ForEach(element=>element.ElementMethod());

今は疑問に思っていましたが、さらに一歩進んで次のようにすることはできMyArray.ForEach(ElementMethod);ますか?

編集:私はこのようなことを試みていましたが、すでにいくつかの興味深い答えがあります:

public static void CallOnEach<T> (this IEnumerable<T> source, Action action)
{
    foreach (T element in source) {
        element.action();
    }
}

もちろん、コンパイラは 'action' が T のメソッドであることを知ることができないため、これは機能しません :( おそらく、これをコンパイラに保証する方法はありますか?public static void CallOnEach<T> (this IEnumerable<T> source, Action action) where action isFunctionOf T

ありがとう!

4

2 に答える 2

2

ElementMethodタイプの場合はAction<T>、拡張機能ですぐに使用できます。そしてstatic void、 type のようなメソッドと同じですT:

public static void ElementMethod<T>(T parameter){}

//or

public static void ElementMethod(MyElement element){}

しかし、それをより一般的にする方法はありません。要素を参照せずに要素のメソッドを呼び出すことはできません。

私見:大したことはありません。ほんの数文字を保存しています。

MyArray.ForEach(e=>e.ElementMethod());
MyArray.ForEach(ElementMethod);1234567 - // characters saved ;-)
于 2013-01-31T13:28:22.227 に答える
1

ElementMethod を拡張メソッドにすることができ、後者を行うことができます

于 2013-01-31T13:26:37.690 に答える