2017-02-12 33 views
0

我想知道是否有一種方法可以將func(或類似方法)應用於左側對象。 例如:C#func <>應用於左側對象

member1.MyFunction() 

下面是簡化的使用情況。我們得到了ClassA,它包含一個ClassB的List和一個總結classB的元素的方法。 classB具有兩個屬性memberX和memberY,屬於double類型。 func是用來選擇我們想要總結的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); 
    } 
} 

然後調用它像這樣

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方法已經出現在LINQ爲Sum,所以你可以撥打:

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

當然更地道,你會使用屬性替代方法:

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

也爲成語,你會確保你做任何方法有後續.NET命名約定,開始以一個大寫字母。我強烈建議您立即開始遵循命名約定(即使是一次性演示代碼)。

+0

我覺得這個答案真的應該包括aFunction'的'對於第一行中的新定義。用'Func '這個除了給OP提出一個不同的錯誤要求外,不會做任何事情。 – Chris

+0

我編輯了我的帖子以更接近命名約定。感謝您的幫助。 –

0

如果我理解正確的話,你想「上」 ClassB返回其值之一的方法。(是否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; 
    } 
} 

我使用三元運算符?:這裏,以節省if/else一些空間。

現在,如果你能變化ClassBextension methods(如CS1061錯誤消息暗示)可以幫助你:

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

現在,您可以簡單地調用ClassB類型的任何實例彷彿.AFunction()方法最初是在那裏宣佈的。請注意,擴展方法只能訪問可公開訪問的字段。

你也可能想看看properties允許您定義ClassB減少:

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

我絕對會按照建議減少我的班級定義。我不知道擴展方法的存在,這是一個很好的閱讀。 AsI可以改變B類,你的建議可能對我有好處,但我仍然要看看對我的非簡化應用程序是否最好。 –

相關問題