2016-11-17 1 views
0

私はそう無名関数のリストを作成する方法/代表者C#

 private List<Func<int, double, char, string, string>> FuncList; 

のようなリストオブジェクトを持っており、代表者と匿名関数を使用して、このリストに項目を追加しようとしてきました。問題は、このタイプの関数を作成しようとすると、その関数から関数を返さなければならないということです。私はこれを再帰的に行うように管理されていますが、これは無限ループにそれをスローします。このリストに関数を追加することは可能ですか?

私はそう

public delegate Func<int, double, char, string, string> funcDelegate(someFunc); 

ようデリゲートに渡された機能を追加しようとし、この

FuncList.add(funcDelegate); 

このコードは動作しますように、あなたはどのようにsomeFuncを書くのと同じように何かをしています。

正しいタイプを返す関数を作成しようとして失敗しましたが、これはそうではありません。これは再帰的であり、停止するケースがないため機能しません。

public Func<int, double, char, string, string> SomeFunc(int i, double d, char c, string s1, string s2) 
    { 
     Console.WriteLine($"{i}\n{d}\n{c}\n{s1}\n{s2}"); 
     return this.SomeFunc(i,d,c,s1,s2); 
    } 
+2

あなたの問題は不明です。コードを追加してください。 –

+0

C#には匿名の関数/代理人はありません。 –

答えて

1

まず、メソッドに正しい署名がありません。 Func<>の最後の汎用パラメータが戻り値の型です。 Action<>は、voidを返すジェネリックデリゲート型です。

第2に、Func<>の使用のポイントは、新しい種類の代理人を作成する必要がないということです。Func<>はすでにデリゲートです。ここで

は例です:あなたの例では

// A list of delegates that accept an integer and return a string 
    private static List<Func<int, string>> delegateList = new List<Func<int, string>>(); 

    public static string Foo(int x) 
    { 
     return $"Foo {x}"; 
    } 

    public static void Test() 
    { 
     delegateList.Add(Foo); // Add a delegate to a named method 
     delegateList.Add(delegate(int x) { return $"Bar {x * 2}"; }); // Add a delegate to an anonymous method 
     delegateList.Add(x => $"Baz {x * 3}"); // Add a delegate to a lambda 
     foreach (var del in delegateList) 
     { 
      Console.WriteLine(del(23)); 
     } 
    } 

、あなたは別のデリゲートを返す関数へのデリゲートを宣言しているが、それはあなたが達成しようとしているものではないようです。

+0

素晴らしい感謝!これは、私が間違っていたことを明確にするのに役立ちました。 – Giovanni

1

ここに私の2セントの価値がある - それは、最大4つの入力パラメータを持つ任意のデリゲートを扱うが、テストを実行するには...

public class so40645583 
{ 
    private IList<Delegate> FuncList = new List<Delegate>(); 

    public void Add<InputType, OutputType>(Func<InputType, OutputType> func) 
    { 
     FuncList.Add(func); 
    } 

    public void Add<InT1, InT2, OutputType>(Func<InT1, InT2, OutputType> func) 
    { 
     FuncList.Add(func); 
    } 

    public void Add<InT1, InT2, InT3, OutputType>(Func<InT1, InT2, InT3, OutputType> func) 
    { 
     FuncList.Add(func); 
    } 

    public void Add<InT1, InT2, InT3, InT4, OutputType>(Func<InT1, InT2, InT3, InT4, OutputType> func) 
    { 
     FuncList.Add(func); 
    } 

    // This won't work as it is trying to return a delegate type 
    // public static Func<int, double, char, string, string> SomeFunc(int i, double d, char c, string s1) 

    public static string SomeFunc(int i, double d, char c, string s1) 
    { 
     return String.Format("{0} {1} {2} {3}", i, d, c, s1); 
    } 

    public static string SomeFunc2(int i) 
    { 
     return i.ToString(); 
    } 

    public void Test() 
    { 
     Add<int, double, char, string, string>(SomeFunc); 
     Add<int, string>(SomeFunc2); 

     // Try invoking via list 
     Delegate d = FuncList[0]; 
     string s = (string)d.DynamicInvoke(2, 2.0, 'c', "Hi"); 
     Console.WriteLine(s); 
     // Invoke directly 
     s = SomeFunc(2, 2.0, 'c', "Hi"); 
     Console.WriteLine(s); 
     // Now the second one 
     d = FuncList[1]; 
     s = (string)d.DynamicInvoke(5); 
     Console.WriteLine(s); 

    } 
} 

を拡張することができます。

var so = new so40645583(); 
so.Test(); 
関連する問題