2017-02-12 13 views
0

左のオブジェクトにfunc(または同様のメソッド)を使用する方法があるかどうかを調べようとしています。 例:C#func <>左のオブジェクトに適用

member1.MyFunction() 

ここでは、簡略化した使い方を示します。 ClassBのListとClassBの要素を集計するメソッドを含むClassAを取得しました。そしてclassBはdouble型のmemberXとmemberYという2つの属性を持っています。関数は、ClassBのメンバーを合計することを選択するために使用されます。

私はエラーがある

theSum += TheList[i].TheFunction(); 

を書き行でエラーを持っている

:CS1061 C#はの定義との最初の引数を受け入れていない拡張メソッドが含まれていません

タイプを見つけることができます(使用するディレクティブまたはアセンブリ参照がありませんか?)

誰にも回避策がありますか?私の研究は、ジェネリック関数の左側に適用されるものに私を導くことはできませんでした。

public class ClassA 
{ 
    public List<ClassB> TheList; 
    public ClassA() 
    { 
     ClassB m1 = new ClassB(1, 2); 
     ClassB m2 = new ClassB(1, 2); 
     ClassB m3 = new ClassB(1, 2); 
     TheList= new List<ClassB>() { m1, m2, m3 }; 
    } 
    private double CalculateSum(Func<double> TheFunction) 
    { 
     double theSum = 0; 
     for (int i = 0; i < TheList.Count(); i++) 
     { 
      theSum += TheList[i].TheFunction(); 
      // I'd like to use the previous line instead of having to write 
      // a function for both of the following. 
      // theSum += TheList[i].GetMember1(); 
      // theSum += TheList[i].GetMember2(); 
     } 
     return theSum; 
    } 
} 
public class ClassB 
{ 
    private double memberX; 
    private double memberY; 
    public ClassB(double x, double y) 
    { 
     memberX = x; 
     memberY = y; 
    } 

    public double GetMember1() { return memberX; } 
    public double GetMember2() { return memberY; } 
} 

答えて

1

あなたはこのような何かを試みることができる:

private double calculateSum(Func<ClassB, double> aFunction) 
{ 
    double theSum = 0; 
    for (int i = 0; i < aList.Count(); i++) 
    { 
     theSum += aFunction(aList[i]); 
    } 

    return theSum; 
} 

更新

あなたは本当に、その左にオブジェクトにFUNCを適用したい場合は、あなたが拡張メソッドを定義することができます。

public static class ClassBExtensions 
{ 
    public static double Sum(this ClassB arg, Func<ClassB, double> func) 
    { 
     return func(arg); 
    } 
} 

は、次に私が正しくあなたを理解していれば、あなたはその値のいずれかを返します ClassB「オン」メソッドをしたい、この

Func<ClassB, double> func = null; // define your func here 
for (int i = 0; i < aList.Count(); i++) 
    { 
     theSum += aList[i].Sum(func); 
    } 
return theSum; 
+0

私はそれを避けようとしていましたが、答え(および検索結果)を見ると、Func <>または他の同様の方法を使用する他の方法はないと信じています。 –

+0

funcをオブジェクトの左側に適用する場合は、私の更新を参照してください。 –

3

まあなく、かなりその構文ではなく、あなただけ使用することができます。

theSum += aFunction(aList[i]); 

私はあなたがこのために拡張メソッドを書くことができると仮定しますが、上記より慣用的です。実際に

、で開始するLINQを使用すると、より多くの慣用だろう - あなたのcalculateSum方法はSumとしてLINQに既に存在している、あなたが呼び出すことができるように:もちろん

double sum = aList.Sum(x => x.getMember1()); 

をより慣用的に、あなたがプロパティを使用したいです代わりに、メソッドの:

double sum = aList.Sum(x => Member1); 

またイディオムのために、あなたはあなたがどんな方法がが大文字で始まる、フォロー.NETの命名規則を持っていることを確認してくださいと思います。私はを強くと命名規則に従うことをお勧めします。

+0

。 'Func 'では、OPに別のエラーを出すこと以外は何もしません。 – Chris

+0

命名規則に近づくために投稿を編集しました。ご協力ありがとうございました。 –

0

のようにそれを呼び出します。(ClassBは、このような方法を持っているか、いないかどうか - それは、単純に計算の一部で、そのように実際にClassAに属するかもしれない - 別の質問である。)

あなたがClassBを変更することができた場合は、単にそこに追加します。

public class ClassB 
{ 
    private double memberX; 
    private double memberY; 
    public ClassB(double x, double y) 
    { 
     memberX = x; 
     memberY = y; 
    } 

    public double GetMember1() { return memberX; } 
    public double GetMember2() { return memberY; } 

    public double AFunction() 
    { 
     bool condition = ... 
     return condition ? memberX : memberY; 
    } 
} 

ここでは、?:の3進演算子を使用して、一部のスペースをif/elseに保存しています。

public static class ClassBExtensions 
{ 
    public double AFunction(this ClassB b) 
    { 
     bool condition = ... 
     return condition ? b.GetMember1() : b.GetMember2(); 
    } 
} 

あなたは今、単にかのようにタイプClassBの任意のインスタンスに.AFunction()を呼び出すことができます(CS1061エラーメッセージに示唆したよう)あなたがない変更ClassBは、extension methodsはあなたを助けるかもしれないことができれば今

メソッドはもともとそこに宣言されていました。拡張メソッドは、一般にアクセス可能なフィールドにしかアクセスできないことに注意してください。

あなたはまた、あなたにClassB定義を減らすことができpropertiesに見たいと思うかもしれません:私はこの答えは本当にその最初の行のためのaFunction` `の新しい定義を含めるべきであると感じ

public class ClassB 
{ 
    public ClassB(double x, double y) 
    { 
     MemberX = x; 
     MemberY = y; 
    } 

    public double Member1 { get; } 
    public double Member2 { get; } 

    /* 
    public double AFunction() 
    { 
     bool condition = ... 
     return condition ? Member1 : Member2; 
    } 
    */ 
} 
+0

私は間違いなくクラスの定義を減らすつもりです。私は拡張メソッドの存在を知らなかった、それは良い読書です。クラスBを変更することができますが、あなたの提案は私には良いかもしれませんが、単純化されていないアプリケーションに最適かどうかは今でもわかります。 –

関連する問題