2016-07-13 10 views
1

次のことを達成するにはどうしますか?ここで私が何をしようとしています何のいくつかの単純化された半擬似コードは次のとおりです。C#で次のような匿名/代理人を作成することはできますか?

class Foo { 

    static public FUNCTION one(int foo, int bar) {  
    return List<Vector> FUNCTION(int num) {  
     List<Vector> v = new List<Vector>(); 
     for (int i = 0; i < num; i++) { 
     v.Add(new Vector(1+foo, 1+bar));  
     } 
     return v; 
    } 

    static public FUNCTION two(int foo, int bar) {  
    return List<Vector> FUNCTION(int num) {  
     List<Vector> v = new List<Vector>(); 
     // Do something else? 
     return v; 
    } 

    }  
} 

その後、私はそうのようにそれを呼び出すしたいと思います:

generic = Foo.one(1, 2); 
List<Vector> v = generic(2); 

generic = Foo.two(1, 2); 
List<Vector> v = generic(2); 

私は、これは一種のものの線に沿っていると思います私は欲しいですが、最初の引数をどのように渡すかは分かりません。

public static Func<int, int, List<Vector>> one() 
{ 
    Func<int, List<Vector>> func = (int num) => 
    { 
     List<Vector> v = new List<Vector>(); 
     return v; 
    }; 
    return func; 
} 

答えて

1

これはあなたの問題解決のための解決策ですか?それはClosureと呼ばれるコンストラクトです。あなたがすでに持っていたものの組み合わせです。

public static Func<int, List<Vector>> one(int foo, int bar) 
{ 
    Func<int, List<Vector>> func = 
     num => 
     { 
      List<Vector> v = new List<Vector>(); 
      for (int i = 0; i < num; i++) 
      { 
       v.Add(new Vector(1 + foo, 1 + bar)); 
      } 
      return v; 
     }; 

    return func; 
} 
+0

これはまさに私がやろうとしていたものだと思います。私は1つの質問を持っています。両方のFuncシグネチャは一致する必要がありますか? public static Func > 1(int foo、int bar) { Func > func =(num、num2)=> {}; return func; } – williamt

+0

もちろんです。返されるオブジェクトの型は、関数シグネチャで定義されている型と同じ(または派生型)でなければなりません。また、文字列の戻り値を期待する関数から整数を返すこともできません。 'Func >'オブジェクトを返そうとすれば、 'one'関数のリターンシグネチャで定義してください。 – Fratyx

関連する問題