【问题标题】:Is it possible to use a method argument as an array extension method是否可以将方法参数用作数组扩展方法
【发布时间】:2015-06-09 00:56:57
【问题描述】:

我试图将一个参数传递给一个方法,然后将该参数用作数组扩展方法,但我很挣扎。我的代码是:

//create method
public static void BankChoice(string SearchItem)
{
    //declare variables
    double tempMin = 0;
    int minIndex = 0;

    //set a temporary double as the first index of array
    tempMin = Program.array_SH1[0].SearchItem;

    //start loop to go through whole array
    for (int y = 0; y <= array_SH1.Length; y++)
    {
        //if the temp double is bigger than the array item, 
        //make array item temp double
        if (tempMin > array_SH1[y].SearchItem)
        {
            tempMin = array_SH1[y].SearchItem;
            minIndex = y;
        }
    }
}

然后我将代码称为:

BankChoice("OpenPrice")

但是这不起作用。编译器不会接受字符串作为数组扩展名,它只会抛出错误。 有没有办法解决这个问题,而不必手动进行,并为 SearchItem 的所有变体创建一个方法

谢谢

【问题讨论】:

  • 不,你不能那样做。你需要研究的是如何使用反射来实现这一点。
  • 旁注:您的示例未显示类似于在任何地方调用扩展方法的语法...

标签: c# arrays methods arguments


【解决方案1】:

你可以做的是提供一个委托:

public static void BankChoice(Func<ArrayValueType, double> searchBy)
{
    //...
    // use the delegate to evaluate the result for each time you need to get the value from an item in your array.
    tempMin = searchBy(Program.array_SH1[0]);
    //...
}

ArrayValueType 是数组中对象的类型。然后你用

调用它
BankChoice(x => x.OpenPrice);

这将允许您指定要搜索的属性,并且将以类型安全的方式完成。目前唯一的限制是该属性可以转换为double。对于泛型类型的属性,可以绕过这个问题,并且有多种方法可以做到这一点,具体取决于您的需求。

【讨论】:

  • 虽然这是正确的方法,但严格来说,它不满足“没有……为 SearchItem 的所有变体创建方法”,因为每个 lambda 都会被编译器转换为本地方法(我严重怀疑如果 OP 实际上意味着添加这样的限制)。
  • 是的,听起来他真正想要的是能够编写一个算法,该算法接受一个参数,让他指定将算法应用于哪个属性,以避免必须为每个算法重写整个算法想要搜索的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多