2009-06-16 25 views
6

メソッドグループを式に変換するための単純な構文があるかどうかを調べようとしています。これは、ラムダと十分に簡単そうですが、それはメソッドに変換されません。メソッドグループを式に変換する

public delegate int FuncIntInt(int x); 

を考えるのすべてを以下有効です。

Func<int, int> func1 = x => x; 
FuncIntInt del1 = x => x; 
Expression<Func<int, int>> funcExpr1 = x => x; 
Expression<FuncIntInt> delExpr1 = x => x; 

しかし、私は同じしようとした場合インスタンスメソッドは、式で破綻:

Foo foo = new Foo(); 
Func<int, int> func2 = foo.AFuncIntInt; 
FuncIntInt del2 = foo.AFuncIntInt; 
Expression<Func<int, int>> funcExpr2 = foo.AFuncIntInt; // does not compile 
Expression<FuncIntInt> delExpr2 = foo.AFuncIntInt;  //does not compile 

は最後の二つのどちらも、C」でコンパイルに失敗しますメソッドグループ 'AFuncIntInt'を非代理人型 'System.Linq.Expressions.Expression <>'に変換します。あなたは、メソッドを呼び出すするつもりでしたか?」

だから、表現方法のgrouをキャプチャするための良好な構文がありますか?

おかげで、 アルネを

答えて

6

どう?この程度

Expression<Func<int, int>> funcExpr2 = (pArg) => foo.AFuncIntInt(pArg); 
    Expression<FuncIntInt> delExpr2 = (pArg) => foo.AFuncIntInt(pArg); 
+0

Dooh ..今私は愚かな気がする。それは完全に機能します。おかげで –

+2

あなたはこれまでより良い構文を見つけましたか?コンパイラがFunc のメソッドグループを理解できない理由を完全には理解していません。です。 – skrebbel

+0

私の前提は、foo.AFuncIntIntは式ではなくメソッドグループですメソッドグループから式への自動変換はありませんが、ラムダをメソッドグループまたは式として受け入れるための自動変換があります –

0

NJection.LambdaConverterを使用して行うこともできます。代理人からラムダエクスプレッションへの変換ライブラリ

public class Program 
{ 
    private static void Main(string[] args) { 
     var lambda = Lambda.TransformMethodTo<Func<string, int>>() 
          .From(() => Parse) 
          .ToLambda();    
    } 

    public static int Parse(string value) { 
     return int.Parse(value) 
    } 
} 
関連する問題