函数可以返回静态函数吗?

时间:2014-10-28 19:57:35

标签: c# function instantiation

TL; DR:标题说明了一切,如果问题可以简单回答,那么一个简单的答案会很棒

更长的版本: 我使用预先存在的库来构建发票,并且库包含发票对象和静态函数的实例化,这些函数将项目添加到发票中。发票上的项目包括子项目的细分,它有大约十几列。没有项目使用所有列,列使用和值取决于列出的项目及其在细分中的深度。

因此,可以使用伪代码构建发票:

Invoice customerInvoice = new Invoice();
MainItem widget = new MainItem(); //the entirety of the sale, this is shown as the top-level item
SubItem component = new SubItem(widget, values[]); //a component of widget. The parameters identify the main piece that this attaches to, and a set of values for the other columns.
SubItem piece = new SubItem(widget, values[]); //another component; the values[] will be slightly different but correspond to the same columns.
SubItem bolt = new DeepSubItem(piece, lowestValues[]); //an irreducibly small item which is a part of the "piece" item, with it's own set of values which fill a different arrangement of columns

组件和子组件显示在其父对象下方的缩进行中。 我正在尝试创建一个新的类结构,可以帮助简化这一过程。最大的问题是这里的值[]代表大约20个单独的参数。此外,由于个别产品的怪癖,基于销售地点或时间的变化以及许多其他因素,需要迷宫的条件陈述。唯一不变的是每个函数对应发票上的一行。原始库非常适合嵌套对象,但它无法处理逻辑。仅存在片,螺栓和组件的SubItem实例,以便它们可以被分解。调用SubItem()或DeepSubItem()时,对象将附加到它们的参数中包含的对象。

第一个问题:构建可以使用现有库的新结构,但提供灵活的逻辑,有什么好的计划/设计模式/策略?

第二个问题:如果我可以创建静态函数的“实例”,我可以使用该实例而不需要参数的大量详细信息。有没有办法做到这一点,或者有类似效果的东西?

我一直在考虑创建一个新类,它将执行逻辑并保存所需的值集。然后,该类可以创建“对象”(理想情况下,静态函数的实例),我可以在我们已有的代码中使用它们,替换函数调用。这将允许我将冗长(很少需要改变)与逻辑(通常需要改变)分开。我不能简单地使用对象“bolt”,因为我实例化它的那一刻,它被添加到发票中 - 因此我想将该函数视为一个对象。

非常感谢您明智的输入(和/或现实检查)。谢谢,

2 个答案:

答案 0 :(得分:1)

您可以使用Func对象的方法之一。这允许您通过引用传递函数。这是一个例子:

 private static object TestStaticFunction()
 {
    return "test";
 }

 public static Func<object> GetStaticFunction
 {
     get { return TestStaticFunction; }
 }

然后,任何调用GetStaticFunction的函数都会将TestStaticFunction返回给它。同样,Console.Write(GetStaticFunction())将显示&#34; test&#34;。

请注意,如果要传递不返回值的方法,请改用Action。

这是关于Func的MSDN文档:http://msdn.microsoft.com/en-us/library/bb549151%28v=vs.110%29.aspx

另一个StackOverflow线程有更多解释:What is Func, how and when is it used

就你的程序设计而言,我并不确定我是否能够很好地理解这个库,以指向更好的模式。你被迫在这个图书馆工作吗?

答案 1 :(得分:0)

你在谈论代表吗?

class Program
{
    static void Main(string[] args)
    {
        var returnedFunction = TestClass.FunctionToReturnAStaticMethod();
        returnedFunction();
    }
}

public class TestClass
{
    public delegate void TypeOfFunctionToReturn();

    public static TypeOfFunctionToReturn FunctionToReturnAStaticMethod()
    {
        return () => StaticMethod();
    }

    public static void StaticMethod()
    {
        Console.WriteLine("\"StaticMethod\" called");
    }
}