2017-02-12 35 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类,你的建议可能对我有好处,但我仍然要看看对我的非简化应用程序是否最好。 –

相关问题